基于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);
        }
    }
}
posted @   QQ9fb8  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示