マルチスレッドのチャットルーム

Javaベースのマルチスレッドのチャットルーム

クライアント:

パブリック クラスMultiThreadClient { 

    プライベート 静的 クラスRecMsgはRunnableを実装して、{
         プライベートソケットクライアントを、

        公共RecMsg(ソケットクライアント){
             この .client = クライアント。
        } 

        @Override 
        公共 ボイドラン(){ 
            スキャナSC = NULL ;
            試す{ 
                SC = 新しいスキャナ(client.getInputStream())。
            } キャッチ(IOExceptionを電子){ 
                e.printStackTrace(); 
            }
            一方、){
                 場合(client.isClosed()){ 
                    システム。アウト .println(" 客户端退出" );
                    破ります; 
                } 
                であれば(sc.hasNextLine()){ 
                    システム。アウト .println(" 服务端说:" + sc.nextLine()); 
                } 
            } 
            )(sc.close。
        } 
    } 


    プライベート 静的 クラスSENDMSGは{Runnableを実装
         プライベートソケットクライアント; 

        公共SENDMSG(ソケットクライアント){
             この .client = クライアント。
        } 

        @Override 
        公共 ボイドラン(){ 
            スキャナSC = 新しいスキャナ(システム。); 
            PrintStream psの = nullを試す{ 
                PS = 新しいのPrintStream(client.getOutputStream()、" UTF-8 " ); 
            } キャッチ(IOExceptionを電子){
                e.printStackTrace(); 
            } 
            一方){ 
                システム。アウト .println(" 请输入内容" ); 
                文字列str = sc.nextLine()。
                ps.println(STR)。
                もし(str.contains(" BYE " )){
                     ブレーク
                } 
            } 
            ps.close()。
            sc.close(); 

        } 
    } 

    パブリック 静的 ボイドメイン(文字列[]引数)はIOExceptionが{スロー 
        ソケットSC = 新しいソケット(127.0.0.1 8888 )。
        新しいスレッド(新しいRecMsg(SC))(開始)。
        新しいスレッド(新しいSENDMSG(SC)))(開始。
    } 
}

サーバー:

public class MultiThreadServer {
    //保存所有连接的客户端
    private static Map<String, Socket> clientMap = new ConcurrentHashMap<>();

    private static class ExecuteClientMap implements Runnable{

        private Socket client;

        public ExecuteClientMap(Socket client) {
            this.client = client;
        }

        @Override
        public void run() {
            Scanner sc = null;
            try {
                sc = new Scanner(client.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            while(true){
                if(sc.hasNextLine()){
                    String msgFromClient = sc.nextLine();
                    if(msgFromClient.startsWith("R:")){
                        //注册
                        //用户名
                        String username = msgFromClient.split(":")[1];
                        userRegister(username,client);
                    }else if(msgFromClient.startsWith("P:")){
                        //私聊P:用户名-信息
                        String userName = msgFromClient.split(":")[1].split("-")[0];
                        String msg = msgFromClient.split("-")[1];
                        sendPriUser(userName,msg);

                    }else if(msgFromClient.startsWith("G:")){
                        //群聊
                        String groupMsg = msgFromClient.split(":")[1];
                        group(groupMsg);
                    }
                }
            }
        }

        private void sendPriUser(String userName,String msg) {
            Socket sc = clientMap.get(userName);
            PrintStream ps = null;
            try {
                ps = new PrintStream(sc.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            ps.println("私聊信息为:"+msg);
            ps.close();
            try {
                sc.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        private void userRegister(String username, Socket client) {
            clientMap.put(username,client);
            String str = username+"上线了";
            group(str);
        }

        private void group(String str) {
            Collection<Socket> values = clientMap.values();
            for(Socket sc : values){
                PrintStream ps = null;
                try {
                    ps = new PrintStream(sc.getOutputStream());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                ps.println(str);

            }

        }
    }

    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(8888);
        ExecutorService executorService = Executors.newFixedThreadPool(20);
        for(int i = 0;i<20;i++){
            System.out.println("等待客户端连接");
            Socket sc = ss.accept();
            System.out.println("连接成功,端口号为:"+sc.getPort());
            //新建一个线程处理客户端的连接
            executorService.submit(new ExecuteClientMap(sc));
        }
        ss.close();

    }
}

 

おすすめ

転載: www.cnblogs.com/du001011/p/11111783.html