Java服务器 - 多客户端TCP连接I / O.

时间:2013-11-17 11:33:33

标签: java tcp io client-server

我在这里找不到类似的帖子,所以这里是:

当我启动服务器和几个客户端时,我希望所有客户端上的用户能够输入要处理的数据。此外,我希望服务器能够在所有客户端会话终止后退出监听循环。

服务器代码监听循环:

//Console console = System.console();
// or 
//InputStreamReader str = new InputStreamReader(System.in);
//BufferedReader uinp = new BufferedReader(str);

// ...

try (ServerSocket serverSocket = new ServerSocket(portNumber)) { 
    while (listening) {
        new SocketServerThread(serverSocket.accept()).start();

        //String serverInput = console.readLine("> ");
        //if ( serverInput.equalsIgnoreCase("exit") ) { listening = false; }
        // or
        //System.out.print("> ");
        //if ( (uinp.readLine()).equalsIgnoreCase("exit") ) { listening = false; }
    }
} catch (IOException e) {
    System.err.println("Could not listen on port " + portNumber);
    System.exit(-1);
}

以下是:1)如果我对服务器进行编码以便能够接收输入并对其进行处理(例如"退出"字符串告诉服务器退出监听循环),它似乎第二个客户的线程不会运行,我觉得这很奇怪。 2)如果我不对服务器进行编码以便能够退出监听循环,那么服务器如何退出用户的循环?

正如您所看到的,我已经尝试过(a)控制台和(b)InputStreamReader和BufferedReader,但它们都没有工作。

所以,我的问题是:如何让服务器退出用户的监听循环并允许第二个客户端的线程同时运行?

1 个答案:

答案 0 :(得分:2)

我认为您已经混淆了客户端服务器架构的目的 服务器是集中式系统客户端可以连接并请求一个或多个服务。那么你所说的是你想要停止集中式系统,即服务器,还是让其他客户端继续运行?这是不可能的。因为没有服务器就不能存在客户端(如果它首先没有服务器就不会被称为客户端)

因此,如果您退出服务器的侦听循环,则没有客户端可以连接到它。因此,不能执行客户端线程。 如果您希望所有服务器 - 客户端会话都根据客户端用户的意愿终止。你可以做一个解决方法。

在服务器端保留count变量。随着每个新客户端的增加而减少客户端的减少。此外,再次在服务器端保留一个布尔变量,如toClose初始化为false。现在让我们说客户端'A'告诉服务器关闭(就像你已经完成的那样“退出”命令),你将toClose的值改为true。
现在,在每个客户端会话结束时,您可以检查以下内容:

if (toClose == true && count <=0 )
    exitListeningLoop()