多线程问题

本文介绍了一个简单的服务器客户端聊天系统,包括服务器端和客户端的实现,使用Socket进行通信,客户端能够实时接收并发送消息。

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

package com.chat.demo; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Iterator; public class Server { static final String SOCKT_IP = "127.0.0.1"; static final int SOCKT_PORT = 8888; static int clientId = 0; public static void main(String[] args) { //用来存储连接客户端的socket ArrayList<Socket> sockets = new ArrayList<Socket>(); try { ServerSocket ss = new ServerSocket(8888); while (true) { Socket s = ss.accept(); sockets.add(s); new ReadThread(s, sockets).start(); System.out.println("客户端的个数:" + sockets.size()); } } catch (IOException e) { e.printStackTrace(); } } } class ReadThread extends Thread { private ArrayList<Socket> sockets; private Socket socket; boolean flag = true; public ReadThread(Socket socket, ArrayList<Socket> sockets) { this.socket = socket; this.sockets = sockets; } public void run() { try { DataInputStream dis = new DataInputStream( socket.getInputStream()); boolean isExit = false; while (flag) { String msg = dis.readUTF(); if(msg.contains("!q")){ msg = msg.replace("!q", "离开聊天室"); isExit = true; } System.out.println(msg); if (msg != null && !msg.equals("")) { for (Iterator iterator = sockets.iterator(); iterator .hasNext();) { Socket s = (Socket) iterator.next(); DataOutputStream dos = null; if(s != socket){ dos = new DataOutputStream(s.getOutputStream()); dos.writeUTF(msg); dos.flush(); } } } if(isExit){ isExit = false; flag = false; sockets.remove(socket); socket.close(); } } } catch (IOException e) { } } } ************************************************************************************************************ package com.chat.demo; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class Client { private int id; //编号 private String name; //客户端名称 private Date loginTime; //发送时间 private Socket sokcet; //与服务器连接的socket private ClientRead cr; private ClientWrite cw; public Client(String name){ this.name = name; this.id = Server.clientId++; this.loginTime = new Date(); try { this.sokcet = new Socket(Server.SOCKT_IP,Server.SOCKT_PORT); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } cr = new ClientRead(sokcet,this); cw = new ClientWrite(sokcet,name,this); } public void start(){ cr.start(); cw.start(); } public void close(){ System.exit(0); } public static void main(String[] args) { // new Client("张三").start(); // new Client("李四").start(); new Client("王五").start(); } } class ClientRead extends Thread{ private Socket s; private Client c; public ClientRead(Socket s , Client c){ this.s = s; this.c = c; } public void run(){ try { while(true){ DataInputStream dis = new DataInputStream( s.getInputStream()); String msg = dis.readUTF(); System.out.println(msg); } } catch (IOException e) { e.printStackTrace(); } } } class ClientWrite extends Thread{ private Socket s; private String name; boolean isLogin; //登录状态 默认为false private Client c; public ClientWrite(Socket s,String name,Client c){ this.s = s; this.name = name; this.isLogin = false; this.c = c; } public void run(){ Scanner scan = new Scanner(System.in); try { DataOutputStream dis = new DataOutputStream( s.getOutputStream()); while(true){ SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); String sendTime = format.format(new Date()); String msg = null; if(isLogin){ msg = name+"说:"+scan.next()+"\t"+sendTime; }else{ msg = "欢迎"+name+"\t"+sendTime; isLogin = true; } dis.writeUTF(msg); dis.flush(); if(msg.contains("!q")){ c.close(); } } } catch (IOException e) { } } }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值