基于tcp的多线程聊天室的实现
基于tcp的多线程聊天室的实现
服务器
package Test;
//服务器
import ChatRoom01.Sreverjs;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
public class Server01 {
DataOutputStream dataOutputStream=null;
boolean issatart=false;
Socket socket=null;
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9998);
System.out.println("服务器已经启动");
ArrayList<Sreverjs> arrayList=new ArrayList<>();
Socket accept = null;
//等待连接
while (true){
accept = serverSocket.accept();
arrayList.add(new Sreverjs(accept,arrayList)); //传入一个Socket对象,并且传入一个集合,并且开启了服务器接收并转发的线程
System.out.println("一台客户端已经连接 ip:"+accept.getInetAddress()+"端口:"+accept.getPort());
System.out.println("当前服务器人数:"+arrayList.size());
// new Thread(new Sreverjs(accept,arrayList)).start();
}
}
}
服务器接收的线程
package ChatRoom01;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
//服务器接收的线程
public class Sreverjs implements Runnable{
String s=null;
Socket socket=null;
ArrayList<Sreverjs> arrayList;
public Sreverjs(Socket socket, ArrayList<Sreverjs> arrayLis) {
this.arrayList=arrayLis;
this.socket=socket;
new Thread(this).start(); //在构造对象的时候就开启线程。线程是启动自己,用于接收客户端传入来的数据,并且把他发送出去
}
public Sreverjs(Socket socket) {
this.socket=socket;
new Thread(this).start();
}
public Sreverjs( ArrayList<Sreverjs> arrayList ) {
this.arrayList=arrayList;
new Thread(this).start();
}
@Override
public void run() {
try {
DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
while (true){
DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream());
s = dataInputStream.readUTF();
System.out.println("ip:"+socket.getInetAddress()+"端口:"+socket.getPort()+" 说:"+s);
Iterator<Sreverjs> iterator = arrayList.iterator();
//遍历传入来的集合,集合里的每一个对象都是socket连接
while (iterator.hasNext()){
Sreverjs next = iterator.next();
next.send(s);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//发送方法,用于直接发送读取到的文字
public void send(String s) throws IOException {
DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF(s);
}
}
客户端
package Test;
import java.awt.*;
import java.io.*;
import java.net.ConnectException;
import java.net.Socket;
import java.util.Scanner;
//客户端
public class Client {
private static final String IP="127.0.0.1";
private static final int port=9998;
public Client() throws IOException {
try {
Socket socket=new Socket(IP,port);
Scanner scanner=new Scanner(System.in);
DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream());
new Thread(new Demo03(socket)).start(); //接收线程
new Thread(new Recive(dataOutputStream,scanner)).start(); //写出线程
}catch (IOException e){
System.out.println("服务器未上线");
}
}
public static void main(String[] args) throws IOException {
}
}
//客户端写出消息的线程
class Recive implements Runnable{
DataOutputStream dataOutputStream=null;
Scanner scanner=null;
public Recive(DataOutputStream dataOutputStream, Scanner scanner) {
this.dataOutputStream = dataOutputStream;
this.scanner = scanner;
}
@Override
public void run() {
while (true){
System.out.println("请输入消息");
try {
String s=scanner.nextLine();
dataOutputStream.writeUTF(s);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
客户端接收数据的线程
package Test;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.ArrayList;
//客户端接收的线程
public class Demo03 implements Runnable {
Socket socket=null;
public Demo03(Socket socket) {
this.socket=socket;
}
@Override
public void run() {
try {
while (true){
DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
String s = dataInputStream.readUTF();
System.out.println("ip:"+socket.getInetAddress()+"端口:"+socket.getPort()+" 说:"+s);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能