网络编程----TCP实现聊天室项目

本文介绍了一个基于TCP的多用户聊天室项目,利用Java的多线程技术,服务端对每个Socket连接创建单独的线程,客户端则通过独立的接收和发送线程实现读写分离。服务端通过CopyOnWriteArrayList存储所有客户端连接,以便群发消息。此外,还实现了私聊功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

在学TCP的时候就做了一个多用户登录并得到响应的一个小项目,这个聊天室也是基于TCP通信原理的交互,在服务端对接收的Socket对象封装成线程类,开启多线程实现多用户同时接发数据。
不同的点是:

客户端

对接收和发送的代码进行了封装,封装成独立出来的两个线程类,就可以实现读写分离,不再是请求响应式的交流。

public class Client {
   
 public static void main(String[] args) throws UnknownHostException, IOException {
   
		System.out.println("------client------");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("请输入用户名");
		String name = br.readLine();
		//建立连接:socket创建客户端
		Socket client = new Socket("localhost",8888);
		
        //客户端发送信息
		new Thread(new ClientSend(client,name)).start();  //导入发送线程类
		//获取消息
		new Thread(new ClientReceive(client)).start(); //导入接收线程类
}
}

上面导入name变量之后在创建线程体时会先把name导入,这样在服务端就可以接收到这个线程对象的name属性,方便后面群发消息可以调用说话的客户端的名字。

下面就是客户端的接收和发送的两个线程类。
接收:

public class ClientReceive implements Runnable {
   
	DataInputStream dis ;
	Socket client;
	boolean isRunning = true;
	public ClientReceive(Socket client){
   
		this.client = client;
		try {
   
			dis = new DataInputStream(client.getInputStream());
		} catch (IOException e) {
   
			release();
		}
	
	}
	public void run() {
   
		while(isRunning) {
   
		//接收消息
        String datas;
		try {
   
			datas = dis.readUTF();
			System.out.println(datas);
		} catch (IOException e) {
   
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
       
	}
	
	//释放资源
		private void release() {
   
			this.isRunning = false;
			try {
   
				dis.close();
				client.close();
			} catch (IOException e) {
   
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}


}

发送类:

public class ClientSend implements Runnable {
   
	BufferedReader console;
	DataOutputStream dos;
	Socket client;
	boolean isRunning = true;
	String name;
	public 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值