我尝试使用Java中的套接字连接到多个客户端。一切似乎都有效,但问题是,服务器只是监听第一个客户端。如果有多个客户端,服务器可以向他们发送所有消息,但他只能收听来自第一个客户端的消息。我尝试了这一切(我从昨天起就遇到了这个问题)。所以我很确定,故障必须在班级" ClientListener"。
说明:
有一个客户端列表(与字符串通信的连接)。在GUI中有一个列表,我可以选择,我想与哪个客户进行通信。如果我更改客户端,变量currentClient
(int)将切换到另一个数字
networkClients
是一个ArrayList,其中所有不同的连接都是"存储"。
第一个连接的客户端与其他客户端完全相同,没有什么特别的。当变量currentClient
设置为0(默认情况下)时,将调用它。变量切换正在起作用。就像我说的,如果我向他们发送订单,所有客户都会给我回复,但服务器(ClientListener)只能听到networkClients.get(0)。
class ClientListener implements Runnable {
String request;
@Override
public void run() {
try {
while (networkClients.size() < 1) {
Thread.sleep(1000);
}
//***I'm pretty sure, that the problem is in this line
while ((request = networkClients.get(currentClient).getCommunicationReader().readLine()) != null) {
//***
myFileList.add(new MyFile(request));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
我希望有人可以帮助我。我尝试了很多东西,但没有任何效果。
编辑:就像我在代码示例中所写的那样,while循环是否有可能切换&#34; currentClient&#34; (由另一个线程处理)?我测试/模拟了一个类似于测试类的东西,结果是,一个while循环当然可以更新其中的状态(意思是,如果变量在while循环的()中发生变化,它当然会是每次重复后检查。)
答案 0 :(得分:1)
你应该看看multithreading。
您的服务器程序应该是:
- The main thread
- A thread that handles new connections.
(Upon creating a new connection, start a new thread and pass the connection on to that thread)
- A thread for each connected client, listening to the each client separately
答案 1 :(得分:0)
我找到了解决方案:
线程位于我在起始帖子中提到的声明方法中(在代码片段中),并等待无限时间以获得客户端的新响应。
所以改变列表的索引&#34; networkClients
&#34;不会做任何事情,因为那里不会发生任何事情,直到客户发送新订单(让线程更进一步)。
所以你需要为每个客户端实现一个额外的监听器。