使用一台服务器处理多个客户端

时间:2014-03-13 18:50:05

标签: java sockets serversocket

我尝试使用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循环的()中发生变化,它当然会是每次重复后检查。)

2 个答案:

答案 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) (2)

答案 1 :(得分:0)

我找到了解决方案:

线程位于我在起始帖子中提到的声明方法中(在代码片段中),并等待无限时间以获得客户端的新响应。 所以改变列表的索引&#34; networkClients&#34;不会做任何事情,因为那里不会发生任何事情,直到客户发送新订单(让线程更进一步)。

所以你需要为每个客户端实现一个额外的监听器。