我有一个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循环中,我会使用list的大小,如果TEMP_SOCK
不是this.socket
,那么我想向该套接字发送一条消息,并且如果它是那么不做任何事情。但我的问题是,当我与2个客户端连接时,他们无法向对方发送消息。他们只是将消息发送到服务器,服务器将消息发送回客户端。我的问题是,你能否像我这样使用一个列表来检查套接字是不是你自己的套接字。
因为现在Client1发送消息并从服务器接收相同的消息,而Client2也做同样的事情。 我希望Client1发送和Client2接收消息(和同一列表上的其他套接字)
答案 0 :(得分:2)
您的代码不起作用,因为您应该让SendMessage
知道它应该向哪个套接字发送消息(即您应该将TEMP_SOCK
传递给它),而是让它使用socket
变量,它是连接到刚刚发送消息的客户端的套接字。