欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java Socket和多线程实现多人聊天

程序员文章站 2022-04-15 23:33:15
前面写了客户端与服务端在线聊天 但是只可以点对点的聊天 今天多人在线它来了 它来了 下面是源代码 服务端有个工具类Chat(这个命名忽略一下~) 客户端代码完全一样 想要多个客户端聊天 就多复制粘贴 多运行几个客户 一如既往的不写注释 而且代码很乱 不过很简洁 写的不好见谅//这是服务端 import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socke...

前面写了客户端与服务端在线聊天 但是只可以点对点的聊天 今天多人在线它来了 它来了 下面是源代码 服务端有个工具类Chat(这个命名忽略一下~) 客户端代码完全一样 想要多个客户端聊天 就多复制粘贴 多运行几个客户 一如既往的不写注释 而且代码很乱 不过很简洁 写的不好见谅

//这是服务端 
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(8888);
            while (true){
                Socket s = ss.accept();
                new Thread(()->{
                    Chat.theUser.put(s.getRemoteSocketAddress() + "",s);
                    Chat.people();
                }).start();

                new Thread(()->{
                    while (true){
                        try {
                            InputStream is  = s.getInputStream();
                            byte[] arr = new byte[1024];
                            int len = is.read(arr);
                            Chat.outPut(arr,len,s.getRemoteSocketAddress() + "");

                        }catch (Exception e){}
                    }

                }).start();

//                new Thread(()->{ //检测用户是否掉线没完成。。。
//                    try {
//                        while (true){
//                            s.sendUrgentData(0xFF);
//                            System.out.println(1);
//                            Thread.sleep(3000);
//                        }
//                    }catch (Exception e){
//                        System.out.println(2);
//                        Chat.theUser.remove(s.getRemoteSocketAddress() + "");
//                        Chat.people();
//                    }
//                }).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
//这是服务端的工具类 
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

public class Chat {
    public static Map<String, Socket> theUser = new HashMap<>();

    public static void outPut(byte[] b, int len ,String user){
        for (String s : theUser.keySet()) {
            Socket socket = theUser.get(s);
            if (!user.equals(s)){
                try {
                    OutputStream os = socket.getOutputStream();
                    String data = s + "说:" + new String(b, 0, len);
                    os.write(data.getBytes());
                } catch (IOException e) {}
            }

        }

    }


    public static void people(){
        System.out.println("当前在线人数:" + theUser.size());
    }
}
//这是客户端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args){//客户端 就是多创建几个client文件
        Scanner sc = new Scanner(System.in);
        try {
            Socket s = new Socket("127.0.0.1",8888);
            new Thread(()->{
                while(true) {
                    try {
                        OutputStream os = s.getOutputStream();
                        os.write(sc.nextLine().getBytes());
                    } catch (IOException e) {}
                }
            }).start();
            new Thread(()->{
                while (true){
                    try {
                        InputStream is  = s.getInputStream();
                        byte[] arr = new byte[1024];
                        int len = is.read(arr);
                        System.out.println( new String(arr, 0, len));
                    } catch (IOException e) {}
                }
            }).start();
        }catch (Exception e){}

    }
}

本文地址:https://blog.csdn.net/YMFYZY/article/details/107331584