【问题标题】:Only last connected client receives message只有最后一个连接的客户端收到消息
【发布时间】:2015-04-21 14:07:32
【问题描述】:

我有一个服务器-客户端程序,我想使用JLabel(MouseClick) 与所有连接的客户端进行通信。但是消息只会传递给最后一个连接的客户端。我无法确定问题所在。这是我的代码

//服务器

void connect_clients()
    {
        try {
            ServerSocket listener = new ServerSocket(7700);
            jButton1.setText("Server Running!");
            jButton1.setEnabled(false);
            try {
                while (true) {

                    socket = listener.accept();
                    try {
                            clientIP = socket.getLocalAddress().getHostName();
                        }    
                    catch(Exception e){}
                    }
            }
            catch(Exception e){}

            }
        catch(IOException ex)
        {
        }
    }
}                                    

private void jLabel2MouseClicked(java.awt.event.MouseEvent evt) {                                     
    PrintWriter out;
     try {
         out = new PrintWriter(socket.getOutputStream(), true);
         out.println("pc2");
     } catch (IOException ex) {
         Logger.getLogger(third_frame.class.getName()).log(Level.SEVERE, null, ex);
     }
}     

//客户端

void connect_server()
    {
        try {
           while(true)
        {
            // TODO code application logic here
            String serverAddress = JOptionPane.showInputDialog(
                    "Enter IP Address of a machine that is\n" +
                            "running the date service on port 9090:");
            s = new Socket(serverAddress, 7700);


            BufferedReader input =
            new BufferedReader(new InputStreamReader(s.getInputStream()));
            String answer = input.readLine();

            System.out.println(answer);
            answer = null;
          }
        }
        catch (IOException ex) {
            Logger.getLogger(client_form.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

注意:Socket 在服务器和客户端中都是全局声明的。

【问题讨论】:

    标签: java client server lan


    【解决方案1】:

    每次服务器接受一个连接时,它都会创建一个新的套接字来表示它。由于每次建立新连接时都会覆盖套接字引用,因此您只持有对最后一个连接的引用。

    private List<Socket> socketList;
    ...
    
    ServerSocket listener = new ServerSocket(7700);
    socketList = new ArrayList<>();
    ...
    
    socketList.add(listener.accept());
    ...
    
    for (Socket socket: socketList) {
       out = new PrintWriter(socket.getOutputStream(), true);
       out.println("pc2");
       ...
    }
    

    【讨论】:

    • 那么我怎样才能存储每个客户端的引用并在以后需要时使用它们呢? @Renatols
    • 您可以创建一个 List 并将服务器创建的套接字添加到其中,以便您可以遍历它以发送消息。
    • 你能给我举个例子来实现这个吗? @Renatols
    • 我已经更新了我的答案,让您简要了解如何做到这一点。
    • 当我实现这个方法时,我的消息只会传递给第一个客户端。 @Renatols
    猜你喜欢
    • 2013-01-28
    • 2017-02-13
    • 2021-12-12
    • 2017-05-26
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    相关资源
    最近更新 更多