java - 我可以使用套接字列表发送给多个客户端吗?

标签 java list sockets server

我有一个ArrayList<Socket> listOfSockets当我收到clientsocket = serversocket.accept()时添加一个套接字像这样listOfSockets.add(clientsocket) 然后我将整个列表发送到另一个类,就像这样。

Server_Client client = new Server_Client(clientSock, clientSocketList);
                    Thread X = new Thread(client);
                    X.start();

这是我将列表和套接字发送到的类的代码

public class Server_Client implements Runnable{
//ArrayList<String> UserNameList;
ArrayList<Socket> clientSocketList;
Socket socket = null;

public Server_Client(Socket X, ArrayList<Socket> L){
    this.socket = X;
    this.clientSocketList = L;
}


@Override
public void run() {
    try {

        ListenforMessage NewMessages = new ListenforMessage(socket);
        Thread myThread = new Thread(NewMessages);
        myThread.start();            
    } catch (Exception e) {
        System.err.println(e);
    }
}
//------------------------------------------------------------------
//Class that handles incoming messages!
class ListenforMessage implements Runnable{
    Socket socket;
    DataInputStream IN;
    DataOutputStream OUT;
    public ListenforMessage(Socket x) {
        this.socket = x;
    }

    @Override
    public void run() {
        try {
            while (true) {                    
                    IN = new DataInputStream(socket.getInputStream());
                    OUT = new DataOutputStream(socket.getOutputStream());
                    String message = IN.readUTF();
                    //System.out.println(message);
                    for (Socket TEMP_SOCK : clientSocketList) {
                        if(TEMP_SOCK != this.socket){ 
                            SendMessage(message);
                        }
                    }
                }                                                  
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    }                        

}

public void SendMessage(String m) throws IOException{
    try {            
        DataOutputStream OUT = new DataOutputStream(socket.getOutputStream());
        OUT.writeUTF(m);
        System.out.println("User said: " + m);
    } catch (Exception e) {
    }

}
//------------------------------------------------------------------
}

ListenforMessage类,在 for 循环中,我遍历列表的大小,如果 TEMP_SOCK不是this.socket然后我想向该套接字发送一条消息,如果是,则不执行任何操作。但我的问题是,当我与 2 个客户端连接时,他们无法互相发送消息。他们只是将消息发送到服务器,然后服务器将消息发送回客户端。我的问题是,你能像我一样使用一个列表来检查套接字是否不是你自己的套接字。

因为现在 Client1 发送消息并从服务器接收相同的消息,而 Client2 执行相同的操作。 我希望 Client1 发送消息,Client2 接收消息(以及同一列表上的其他套接字)

最佳答案

您的代码不起作用,因为您应该让 SendMessage 知道它应该将消息发送到哪个套接字(即您应该将 TEMP_SOCK 传递给它),相反,您使其使用 socket 变量,该变量是连接到刚刚发送消息的客户端的套接字。

关于java - 我可以使用套接字列表发送给多个客户端吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28852647/

相关文章:

javax.ws.rs.NotFoundException : Unable to extract parameter from http request

用于将数据写入 OpenTSDB 的 C# 代码

java - SelectionKey.interestOps(int ops) 的底层工作原理

java - Java 中的服务器套接字 (Android)

java - 无法将字节数组转换为缓冲图像

java - 我有多少余地来学习一门新语言?

java - ServerValue.TIMESTAMP 在 Firebase 中保存和检索时间戳

R:制作一个可用于 Shiny selectInput 的唯一值列表

python:避免列表的zip截断

c# - 比较一个类型的成员——计算成员之间的差异