• 基于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群发消息,那么如果实现点对点发送消息呢。下一讲我们将就这一方面进行探讨。

  • 相关阅读:
    详解【计算机类&面试真题】军队文职考试——第3期 | 何为网络延时?点对点P2P和端对端E2E的工作机制;管态和目态与进程状态的关系;为何要引入多道程序技术?计算机网络和分布式计算机系统的区别?...
    成对连接点云分割
    C. Divan and bitwise operations
    Spring()
    NDAttributeList源码解析及测试
    CAIE ALevel物理(9702)易错题分析
    智能合约是什么?
    Flv.js编译使用
    学习计划
    maven-resources-production:trunk-auth: java.lang.NegativeArraySizeException
  • 原文地址:https://blog.csdn.net/luobanggreat/article/details/125997033