TCP通信--聊天室

TCP聊天室02 通信协议数据包的设计 //Msg.h#pragma once #include <windows.h> #pragma comment(lib,"Ws2_32.lib") //******************************************************************** //Part1:消息结构体定义 //取结构体某个字段的偏移量 //思路:将址址0x000000... 阅读详情

聊天室客户端

public class Client {
	/*
	 * 套接字--可以理解为电话
	 * java.net.Socket
	 * 封装了TCP协议,使用它就可以基于TCP协议进行网络通讯
	 * Socket是运行在客户端的
	 */
	private Socket socket;
	
	/**
	 * 构造方法,用来初始化客户端
	 * 实例化Socket的时候需要传入两个参数:
	 * 1.服务端地址:通过IP地址可以找到服务端的计算机
	 * 2.服务端端口:通过端口可以找到服务端计算机上的服务端应用程序
	 * 
	 * 实例化Socket的过程就是连接的过程,若远端计算机没有响应会抛出异常
	 */
	public Client() throws Exception{
		System.out.println("正在连接服务端...");
		socket=new Socket("localhost",8088);//localhost是自己电脑的IP地址,可以改成其他人的IP地址进行连接
		System.out.println("已与服务端建立连接!");
	}
	
	/**
	 * 启动客户端的方法
	 */
	public void start(){
		try {
			Scanner scanner=new Scanner(System.in);
			/*
			 * 先要求用户输入一个昵称
			 */
			String nickName=null;
			while(true){
				System.out.println("请输入用户名");
				nickName=scanner.nextLine();
				if(nickName.length()>0){
					break;
				}
				System.out.println("输入有误!");
			}

			System.out.println("欢迎您"+nickName+"! 开始聊天吧");
			
			/*
			 * Socket提供的方法:OutputStream  getOutputStream
			 * 获取一个字节输出流,通过该流写出的数据会被发送至远端计算机
			 */
			OutputStream out=socket.getOutputStream();
			OutputStreamWriter osw=new OutputStreamWriter(out,"UTF-8");
			PrintWriter pw=new PrintWriter(osw,true);
			
			//先将昵称发送至服务端
			pw.println(nickName);
			
			
			/*
			 * 启动读取服务端发送过来消息的线程
			 */
			ServerHandler handler =new ServerHandler();
			Thread t=new Thread(handler);
			t.start();
			
			while(true){
			/*
			 * 将字符串发送至服务端
			 */
				pw.println(scanner.nextLine());
				
			
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		try {
			Client client=new Client();
			client.start();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("客户端启动失败");
		}
	}
	
	/**
	 * 该线程用来读取服务端发送过来的消息,并输出到客户端控制台显示
	 * @author xiaoxiannv
	 *
	 */
	class ServerHandler implements Runnable{
		public void run(){
			try {
				InputStream in=socket.getInputStream();
				InputStreamReader isr=new InputStreamReader(in,"UTF-8");
				BufferedReader br=new BufferedReader(isr);
				String message=null;
				while((message=br.readLine())!=null){
					System.out.println(message);
				}
			} catch (Exception e) {
				
			}
		}
	}
	
}

聊天室服务端

public class Server {
	/*
	 * 运行在服务端的ServerSocket主要负责:
	 * 1.向系统申请服务端口,客户端就是通过这个端口与之连接的
	 * 2.监听申请的服务端口,当一个客户端通过该端口尝试建立连接时,ServerSocket会在
	 * 服务端创建一个Socket与客户端建立连接。
	 */
	private ServerSocket server;
	
	/*
	 * 保存所有客户端输出流的集合
	 */
	private List<PrintWriter> allOut;
	
	/*
	 * 用来初始化服务端
	 */
	public Server() throws Exception{
		/*
		 * 初始化的同时申请服务端口
		 */
		server=new ServerSocket(8088);
		allOut=new ArrayList<PrintWriter>();
	}
	
	/**
	 * 将给定的输出流存入共享集合
	 * @param out
	 */
	private synchronized void addOut(PrintWriter out){
		allOut.add(out);
	}
	
	/**
	 * 将给定的输出流从共享集合中删除
	 * @param out
	 */
	private synchronized void removeOut(PrintWriter out){
		allOut.remove(out);
	}
	
	/**
	 * 将给定的消息发送给所有客户端
	 * @param message
	 */
	private synchronized void sendMessage(String message){
		for(PrintWriter out:allOut){
			out.println(message);
		}
	}
	
	/*
	 * 服务端开始工作的方法
	 */
	public void start(){
		try {
			/*
			 * ServerSocket的accept方法是一个阻塞方法,作用是监听服务端口,直到一个
			 * 客户端连接并创建一个Socket,使用该Socket即可与刚连接的客户端进行交互。
			 */
			while(true){
				System.out.println("等待客户端连接...");
				Socket socket=server.accept();
				System.out.println("一个客户端连接了!");
				/*
				 * 启动一个线程,来完成与该客户端的交互
				 */
				ClientHandler handler=new ClientHandler(socket);
				Thread t=new Thread(handler);
				t.start();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		try {
			Server server=new Server();
			server.start();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("服务端启动失败");
		}
	}

	/*
	 * 该线程负责处理一个客户端的交互
	 */
	class ClientHandler implements Runnable{
		/*
		 * 该线程处理的客户端的Socket
		 */
		private Socket socket;
		private String host;//纪录客户端的地址信息
		private String nickName;//该用户的昵称
		
		
		public ClientHandler(Socket socket){
			this.socket=socket;
			/*
			 * 通过Socket可以获取远端计算机的地址信息
			 */
			InetAddress address=socket.getInetAddress();
			host=address.getHostAddress();//获取IP地址
		}
		public void run(){
			PrintWriter pw=null;
			try {
				
				/*
				 * Socket提供的方法InputStream getInputStream()
				 * 该方法可以获取一个输入流,从该流读取的数据就是从远端计算机发送过来的
				 */
				InputStream in=socket.getInputStream();
				InputStreamReader isr=new InputStreamReader(in,"UTF-8");
				BufferedReader br=new BufferedReader(isr);
				
				//首先读取一行字符串为昵称
				nickName=br.readLine();
				sendMessage(nickName+"上线了!");
				
				/*
				 * 通过Socket创建输出流用于将消息发送给客户端
				 */
				OutputStream out=socket.getOutputStream();
				OutputStreamWriter osw=new OutputStreamWriter(out,"UTF-8");
				pw=new PrintWriter(osw,true);
				
				/*
				 * 将该客户端的输出流存入到共享集合中
				 */
				addOut(pw);
				
				
				
				String message=null;
				/*
				 * br.readLine在读取客户端发送过来的消息时,由于客户端断线,而其操作系统的不同,这里读取后
				 * 的结果不同:
				 * 当windows的客户端断开后,br.readLine会抛出异常
				 * 当linux的客户端断开后,br.readLine会返回null
				 */
				while((message=br.readLine())!=null){
					//pw.println(host+"说:"+message);
					
					sendMessage(nickName+"说:"+message);//广播消息
				}
			} catch (Exception e) {
				
			}finally{
				/*
				 * 处理当前客户端断开后的逻辑
				 */
				//将该客户端的输出流从共享集合中删除 
				removeOut(pw);
				
				sendMessage(nickName+"下线了!");
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				
			}
		}
	}
}

基于Linux系统的tcp协议的即时通信系统(聊天室) 这个聊天室完成了一些基础功能私聊、群聊、文件传送等基础功能,可以添加表情符号等其他功能。 离线查看 头文件中的名称的定义可以换成枚举形式,会更加方便一点,我脑抽了就不改了。 阅读详情

相关推荐

Qt网络与通信(TCP聊天室)

目录 TCP理论知识 聊天室 TCP服务器 架构设计 TcpServer TCPClient 关键流程 客户端向服务器发送消息流程 客户端向服务器发出断链信号 文件结构 TCP客户端 架构 函数说明 connectToHost disconnectFromHost write read 源码地址 TCP理论知识 TCP协议是网络中常用的传输层协议,为满足TCP协议的这些特点,TCP协议做了如下的规定: 数据分片:在发送端对用户数据进行分片,在接收端进行重组,由T

啊渊的专栏 5317

uniapp 开发微信小程序使用TCP/UDP通信以16进制发送数据

在微信小程序中实现像网络调试助手中按16进制发送的功能。 如下图调试工具接收到微信小程序发送的16进制数据 let str = 'cf 03 00 00 00 00 1e 59 ce 96 7f 01 00 00 a5' let strs = str.split(" "); //将一个十六进制报文转为字符数组 for(let i = 0;i<strs.length;i++){   strs[i] = "0x"+strs[i]; //每个字符加上0x }

weixin_38946164的博客 1万+

Java——UDP,tcp聊天室,基本功能实现,适合新手,发送表情,字体

Java——UDP,tcp聊天室,基本功能实现,适合新手,发送表情,字体

TCP小程序JAVA,第一讲:编写TCP Socket小程序

根据下面的步骤编写TCP Socket小程序。注意:作者必须是自己的名字。结果如下: 步骤: 1、用VC建立服务器程序 创建一个win32控制台程序 上面的代码如下,编写代码的时候切换到FileView界面: TServer.cpp代码如下: 服务器端运行效果,记得设置防火墙允许: 二、编写客户端,重开另外一个C++6.0程序,新建TClient工程(没截图,所有用旧图,把下面的工程名称TS...

weixin_33581743的博客 459

基于TCP,socket通信,简单小程序

基于TCP,socket通信,简单小程序,很适合初学者

告别轮询!用STM32CubeMX给STM32F030配置ADC多通道+DMA,实测代码分享

本文详细介绍了如何使用STM32CubeMX为STM32F030配置ADC多通道采集与DMA传输,显著提升采集效率。通过实测对比轮询与DMA模式的性能差异,提供完整的代码实现和优化技巧,帮助开发者快速掌握这一高效采集方案。

weixin_42570296的博客 410

tp+微信小程序实现多图片上传

微信小程序结合thinkPHP实现多图片上传,,laravel框架thinkPHP框架均可用

晓看天色暮看云 1264

AI+医疗:多模态模型让肺结节诊断准确率突破95%+的实战方案

多模态融合是必由之路:单一影像模型难以突破95%准确率,必须整合临床、生物标志物等多维数据跨模态注意力机制是核心:简单拼接效果差,注意力机制能自动学习各模态权重,提升融合效果临床适配比技术先进更重要:模型输出必须符合医生诊断习惯,提供可解释的决策依据持续学习是长期成功的关键:医疗数据分布不断变化,模型必须具备自适应能力多学科协作是保障:放射科、胸外科、病理科、AI工程师共同参与模型设计与优化。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1022

基于Socket Tcp协议的简单通讯小程序,带GUI,多线程

基于TCP,pyqt5,多线程的聊天小程序1.使用designer设计图形化界面2.使用PYQT integration 工具将.ui文件转换为.py文件3.显示UI的代码4.然后写两个类:服务端的类Server,客户端类Client服务端的类Server:客户端的类Client:5.下面是重点了!(多线程) 1.使用designer设计图形化界面 2.使用PYQT integration 工具将...

yuerluo的博客 749

一文入门Qwen-Agent【附实战代码】

Qwen-Agent 是一个开源框架,用于开发基于 Qwen 模型的 AI 智能体应用,一文带你入门使用

m0_55303420的博客 1875

风控要略-互联网业务反欺诈之路(一)

当前中国互联网安全产业答题可以分为基础安全和业务安全两个领域。从互联网诞生至2014年,互联网安全行业关注的热点基本都聚焦在网络安全、系统安全和应用安全这个三大基础安全领域上,“DDOS“(分布式拒绝服务攻击)1、“漏洞“、“拖库“2和“挂马“3等大家耳熟能详的术语也是从这些领域中衍生出来的。2014年前后,随着互联网业务的爆炸式发展,黑产团伙开始从“攻击渗透系统“的传统套路进化到“利用业务风控确实进行大规模牟利“的模式,并且逐渐形成规模庞大、分工明确的黑色产业链。

Despacito1006的博客 1014

TCP协议的通信小程序与函数接口

基于之前的UDP通信小程序,再简单实现一个TCP的通信小程序,并了解一个TCP的通信流程

duchenlong的博客 2049

国产数据库PolarDB-X实战:5分钟快速搭建本地开发环境(附Docker一键部署脚本)

本文提供了一份详尽的国产分布式数据库PolarDB-X本地开发环境搭建指南。通过Docker Compose一键部署脚本,开发者可在5分钟内快速启动一个功能完整的PolarDB-X实例,涵盖环境准备、脚本解析、连接验证及日常维护,极大简化了国产数据库的入门和体验流程。

weixin_29246195的博客 359

c#窗体实现 Socket的TCP通信 聊天室案例

一.Socket(套接字)通信概念   套接字(socket)是通信的基石,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。   应用层通过传输层进...

qq_43552118的博客 3588

AI Agent开发第85课-DeepSeek-OCR 安装全指南:从 Transformers 到 vLLM,手把手教你跑通企业级 OCR

本文系统讲解 DeepSeek-OCR 的两种部署方式——基于 Hugging Face Transformers 的标准推理与基于 vLLM 的高性能加速推理。详细说明 CUDA 与 PyTorch 版本匹配、环境验证、依赖安装等关键细节,并提供可直接运行的完整代码示例。无论你是单卡调试还是高并发服务部署,都能在这里找到清晰路径。

打造全国最全的AI Agent开发知识领域的博客 2543

第110章 PCL PointCloudFusing 点云融合重建详细讲解

点云融合是指将多个不同视角、不同位置、不同传感器获取的点云数据进行合并,得到一个更加完整、准确的三维模型。多视角扫描:从多个相机或传感器获取点云数据,需要将这些数据融合成一个统一的三维模型。传感器融合:例如将激光雷达(LiDAR)点云与相机的图像数据融合,以便获得更高质量的三维重建。动态场景重建:动态环境中的物体,点云数据不断更新,如何平滑地融合这些点云是一个重要课题。点云融合的目标是将不同来源的点云数据准确地合并,消除冗余,减少噪声,并提高整体的点云密度和精度。

yumeiguo的博客 503

QT5.7 tcp网络通信 基于TCP的网络聊天室程序

传输控制协议(Transmission Control Protocol,TCP)是一种可靠、面向连接、面向数据流的传输协议,许多高层应用协议(包括HTTP、FTP等)都是以它为基础的,TCP协议非常适合数据的连续传输。 TCP协议工作原理 如图10.9所示,TCP协议能够为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地送达网络上的其他计算机。因此,对可靠性要求高的数据通信...

aa804738534的博客 1108

2026快手爬虫终极指南:JA4+指纹绕过+sign全逆向+AES响应解密(附可运行代码)

快手2026反爬破解实战指南 本文深入剖析快手2026年最新反爬体系,提供完整的破解方案: 四层防御体系:从传输层(JA4+指纹)、应用层(sign参数)、设备层到行为层,90%的爬虫在前两层即被拦截 JA4+指纹绕过:使用curl_cffi模拟Chrome 124的TLS指纹,完美匹配真实浏览器特征 sign参数逆向:通过动态调试提取加密逻辑,Python实现MD5签名算法,包含参数排序和盐值处理 响应解密:破解AES-GCM加密接口数据,完整还原响应内容 技术亮点: 使用curl-impersonate

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1806

聊天室案例 以及对TCP通信的使用规范

TCP通信 Socket原理 Socket简介 获取本地地址和端口号 获取远端地址和端口号 获取网络输入流和网络输出流 close方法 Socket通信模型 Server端ServerSocket监听 Client端Socket连接 C S端通信模型 Server端多线程模型 ...

陳风弥的博客 296

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

多线程及TCP通信 实例之 聊天室

多线程及TCP通信 实例之 聊天室 使用Java的Socket实现客户端和服务端之间的连接,并使得客户端向服务端发送一条消息。 步骤:1、 创建客户端类/** * 客户端应用程序 * * @author Administrator * */ public class Client { .... }2、 创建Socket对象// Socket 用于连接服务器的ServerSoc

程序人生 1265

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

socket转发_基于TCP协议的Socket编程和通信_聊天室_群聊

TCP:聊天室之服务器端---开启通信通道public class Server { //创建一个存储客户端的集合 public static List<MyChannel> list = new ArrayList<MyChannel>(); public static void main(String[] args) { System.out.println(...

weixin_39864373的博客 300

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C基于TCP协议的Socket通信完整Demo(已实现多人聊天室)

C#基于TCP协议的Socket通信完整Demo(已实现多人聊天室) 【下载地址】C基于TCP协议的Socket通信完整Demo已实现多人聊天室 这是一个基于C#开发的TCP协议Socket通信完整示例,专为多人聊天室场景设计。通过简洁的Winform界面,用户能够轻松加入聊天室并与其他在线用户进行实时互动。服务器端支持...

gitblog_06704的博客 843

基于TCP的网络实时聊天室(socket通信案例)

作者:Charzousblog.youkuaiyun.com/Charzous/article/details/109540279开门见山最近一个月记录了学习Socket网络编程的知识和实战案例,相...

Java笔记虾 1179

JAVA基础知识之网络编程——-基于TCP通信的简单聊天室

下面将基于TCP协议用JAVA写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发送信息有两种模式,一种是群聊,所有在线用户都可以看到消息,另一种是私聊,只针对指定账户发送消息 下面是主要的实现思路, 首先是服务器端, 需要使用多线程实现。 主线程用来循环监听...

weixin_30514745的博客 262
上一篇: 多线程基础
兔子eo
博客等级 码龄8年 2粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值