我有一个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/