多线程聊天室

基于Java的多线程聊天室

客户端:

public class MultiThreadClient {

    private static class RecMsg implements Runnable{
        private Socket client;

        public RecMsg(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(client.isClosed()){
                    System.out.println("客户端退出");
                    break;
                }
                if(sc.hasNextLine()) {
                    System.out.println("服务端说:" + sc.nextLine());
                }
            }
            sc.close();
        }
    }

    private static class SendMsg implements  Runnable{
        private Socket client;

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

        @Override
        public void run() {
            Scanner sc = new Scanner(System.in);
            PrintStream ps = null;
            try {
                ps = new PrintStream(client.getOutputStream(),true,"UTF-8");
            } catch (IOException e) {
                e.printStackTrace();
            }
            while(true){
                System.out.println("请输入内容");
                String str = sc.nextLine();
                ps.println(str);
                if(str.contains("bye")){
                    break;
                }
            }
            ps.close();
            sc.close();

        }
    }

    public static void main(String[] args) throws IOException {
        Socket sc = new Socket("127.0.0.1",8888);
        new Thread(new RecMsg(sc)).start();
        new Thread(new SendMsg(sc)).start();
    }
}

服务端:

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();

    }
}

原文地址:https://www.cnblogs.com/du001011/p/11111783.html

时间: 2024-10-10 22:03:25

多线程聊天室的相关文章

MFC笔记之多线程聊天室

新手刚接触,跟着孙鑫老师视频一步一步的做.从VC6.0到VS2010好像并不是那么顺利,下面记录下一点收获. 网络编程的一般步骤: 1声明套接字版本(WSAStartup);2创建套接字(socket);3绑定套接字(bind);4发送接收(sendto/recvfrom);5关闭(closesocket) 第1~3步代码如下: 1 CString error; 2 WORD wver; 3 wver=MAKEWORD(1,1); 4 WSAData data; 5 if(0!=WSAStart

Linux下c++11多线程聊天室

刚看的c++11多线程,写个聊天室试试编译的时候加上 c++11 和 多线程库g++ -Wall -std=c++0x -pthread -o server server.cppserver 和client 都是 q 退出?1. [代码]server.cpp #include <iostream>#include <thread>#include <arpa/inet.h>#include <cstring>#include <vector>#i

Linux下面基于TCP多线程聊天室(客户端)

不怎么会弄这个博客的排版,就直接将代码附上: 主要是使用多线程去等待接受数据和发送数据,下面是客户端的代码: tcpsed.h文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #ifndef RTPSED_H #define RTPSED_H #define BUFFSIZE 512 int runcond; int socketfd; typedef struct TCP_send_arg { char *tcpserver

Linux下面基于TCP多线程聊天室(服务器)

接上篇博文,本文是服务器端的实现,主要实现的功能,就是现实客户端的连接,转发客户端发送的消息,以及客户端掉线提示等功能,同时可以在这这上面扩展和TCP以及线程相关的功能木块. tcpreceive.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #ifndef TCPRECEIVE_H #define TCPRECEIVE_H #define BUFFSIZE 2048 #define listen_max 5 int cond; int

Linux以下基于TCP多线程聊天室(server)

接上篇博文,本文是server端的实现,主要实现的功能,就是现实client的连接.转发client发送的消息.以及client掉线提示等功能,同一时候能够在这这上面扩展和TCP以及线程相关的功能木块. tcpreceive.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #ifndef TCPRECEIVE_H #define TCPRECEIVE_H #define BUFFSIZE 2048 #define listen_max 5

Java Socket 多线程聊天室

本来这次作业我是想搞个图形界面的,然而现实情况是我把题意理解错了,于是乎失去了最初的兴致,还是把程序变成了功能正确但是“UI”不友好的console了,但是不管怎么样,前期的图形界面的开发还是很有收获的,毕竟讲真,想要把Java搞得有形有色的也是很不容易的,借助可视化的插件windowsBuilder,这个过程还是既exciting 又tiring的. 好吧 ,然而图形界面已经成为了历史,现在来说说这个功能正确的console 吧 我也是刚知道的Eclipse里面是可以跑好多个程序的,只要你的一

java多线程控制台聊天室(转)

用java多线程实现一个控制台聊天室,呵呵,好玩! 聊天室服务器端 Java代码   package tf.thread; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.u

【Java】Socket+多线程实现控制台聊天室

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827212.html 聊天室程序的结构图: 架构解释: Server服务器相当于一个中转站,Client客户端程序传送信息到服务器,服务器再把信息分发到其他客户端上,实现即时通信. 所需技术: 1:数据传输. 服务器与客户端之间的信息传递,都通过数据通道实现,有一个客户端连接到服务器,就有一条数据通道架设于该客户端和服务器之间. 这条数据通道通过Socket来实现:每个客户端通过一个socket与服务器建立

你好,博客园!!第一弹~局域网下的简易聊天室,socket与多线程简结

发觉博客园里面关于这些基本知识点的详细内容真是应有尽有,所以这里的随笔就不再重复了,就积累一下简单的用法-- 1.Socket 最近学网络编程,也就是Socket,套接字,一个用来建立链接传输数据的工具. 数据传输发生在"客户端"与"服务端"之间,下面是一种建立连接传输数据的简单方法: (1)客户端 1 try{ 2 //服务端ip 3 String ip = "127.0.0.1"; 4 //服务器端口 5 int port = 5000; 6