• 基于java的简易socket聊天程序


    记得刚上大学时,特别喜欢用qq聊天,用qq发送消息,那时特别惊讶,qq怎么能够实现那么快接收消息功能,而且还是点对点的发送接收消息。

    现在回想起来,其实也不是那么难,只是接触的早晚问题,毕竟在那个年代知道编程的人本来就少。

    这里我们就怎么设计一个简要的群发聊天程序做个简要介绍。

    一、定义需求,实现基于java版的socket聊天程序,能够实现群发消息。

    二、程序流程:

                                  

    三、程序实现

    1、socket服务端代码:监听9000端口,当监听到有客户端接入时,把接收到的socket封装成一个

    ChatSocket类,启动线程,监听socket有没消息过来,当有消息过来时,把消息群发给其他客户端。

    监听程序:

    public class ServerListener implements Runnable {
    
       @Override
       public void run() {
          try {
             ServerSocket serverSocket = new ServerSocket(9000);
             while (true) {
                Socket socket = serverSocket.accept();
                ChatSocket cs = new ChatSocket(socket);
                cs.start();
                ChatManager.getChatManager().add(cs);
             }
          } catch (Exception e) {
             e.printStackTrace();
          }
       }
    
    }

     接收消息程序:

    public class ChatSocket extends Thread {
        Socket socket;
    
        public ChatSocket(Socket s) {
            this.socket = s;
        }
    
    
        public void out(String out) {
            try {
                socket.getOutputStream().write(out.getBytes("GBK"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void run() {
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(socket
                        .getInputStream(), "GBK"));
                String line = null;
                //循环不断读取流
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                    ChatManager.getChatManager().publish(this, line);
                }
                br.close();
            } catch (IOException e) {
               //处理连接关闭
                e.printStackTrace();
            }
        }
    
    }

    2、socket客户端先启动连接socket服务器端,再循环获取服务端发送过来的消息,同时客户端也可以通过文本发送消息。

    public class ClientManager {
        private ChatClientWindow window;
        private Socket socket;
        private String ip;
        private int port;
        private BufferedReader bReader;
        private PrintWriter pWriter;
    
        public ClientManager(String ip,int port)
        {
            this.ip = ip;
            this.port = port;
        }
    
        public void setWindow(ChatClientWindow window) {
            this.window = window;
        }
    
        /**
         * 启动连接线程
         */
        public void connect() {
            new Thread() {
                @Override
                public void run() {
                    try {
                        socket = new Socket(ip, port);
                        pWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"GBK"));
                        bReader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"GBK"));
                        String line = null;
                        while ((line = bReader.readLine()) != null) {
                            window.appendText("收到: " + line);
                        }
                        pWriter.close();
                        bReader.close();
                        pWriter = null;
                        bReader = null;
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    
        public void send(String sendMsg) {
            if (pWriter != null) {
                pWriter.write(sendMsg + "\n");
                pWriter.flush();
            }
        }
    }

    总结:这里简易介绍了怎么用socket群发消息,那么如果实现点对点发送消息呢。下一讲我们将就这一方面进行探讨。

  • 相关阅读:
    图文看懂JavaScritpt引擎V8与JS执行过程
    边缘计算:推动智能时代的前沿技术
    【NOWCODER】- Python:输入输出
    计算机网络的故事——简单的HTTP协议
    如何实现python构建打包供他人安装
    C语言每日一练——Day02:求最小公倍数(3种方法)
    Python实现逐步回归
    png图片打包plist工具,手把手教你使用pngPackerGUI_V2.0
    uniapp 微信小程序如何实现多个item列表的分享
    一文了解数据治理全知识体系
  • 原文地址:https://blog.csdn.net/luobanggreat/article/details/125997033