Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于java多线程服务器/客户端,如何判断客户端线程是否关闭?_Java_Thread Safety_Client Server - Fatal编程技术网

对于java多线程服务器/客户端,如何判断客户端线程是否关闭?

对于java多线程服务器/客户端,如何判断客户端线程是否关闭?,java,thread-safety,client-server,Java,Thread Safety,Client Server,我正在用Java制作一个服务器/客户端程序。服务器等待连接,然后为该连接创建一个新线程。然后服务器返回并侦听其他端口上的连接 sck = srvrSckt.accept(); server.numConnections++; System.out.print("Connection was made on " + server.port[i] + ".\n"); Connections conn = new Connections(sck); server.threads[i] = new Th

我正在用Java制作一个服务器/客户端程序。服务器等待连接,然后为该连接创建一个新线程。然后服务器返回并侦听其他端口上的连接

sck = srvrSckt.accept();
server.numConnections++;
System.out.print("Connection was made on " + server.port[i] + ".\n");
Connections conn = new Connections(sck);
server.threads[i] = new Thread(conn);
server.threads[i].start();
建立连接后,我想返回并检查以前的连接是否已关闭。然后,我将这些端口标记为可用于将来的连接。有办法做到这一点吗

我已经读到,线程之间通信的最佳方式是使用共享变量。然而,我找不到这方面的好例子。另外,我不确定共享变量是否有效,因为我不仅要检查成功关闭的连接,还要检查突然断开的连接

如果您能提供任何帮助,我们将不胜感激。多谢各位

编辑:

下面是代码的较大部分。这可能使我的问题更清楚

if (server.isAvailable[i] == true)
{
    availablePort = server.allPorts[i];
    server.isAvailable[i] = false;
    ServerSocket srvrSckt = new ServerSocket(availablePort);
    System.out.println("Waiting for connection on port " + availablePort + "...");
    srvrSckt.setSoTimeout(5000);
    try {
        sck = srvrSckt.accept();
        server.numConnections++;
        System.out.print("Connection was made on " + server.port[i] + ".\n");
        Connections conn = new Connections(sck);
        server.threads[i] = new Thread(conn);
        server.threads[i].start();
    } catch (Exception e) {
    server.isAvailable[i] = true; // no connection was made
    srvrSckt.close();
}

据我所知,您完全无法控制将端口分配给传入的远程TCP连接。这就是操作系统的工作。当返回true或返回-1表示流结束时,套接字关闭

建立连接后,我想返回并检查以前的连接是否已关闭

通常,在服务器上检测与客户端会话结束的最佳方法是在客户端和服务器之间设置再见协议。客户端将固定令牌发布到服务器,服务器通过关闭通道进行确认。如果客户端突然终止,那么服务器上知道这一点的唯一方法是设置心跳协议,在每次不活动的特定时间,服务器将ping客户端,客户端必须通过pingback进行响应。如果没有响应,服务器必须终止客户端会话


关于在线程之间共享一个变量,您可以参考:

您将这些端口标记为可用是什么意思?您打开了X个端口,并且每个端口只需要服务器1个请求?我不知道您的问题是什么端口?TCP服务器只使用一个端口。您根本不需要管理它,更不用说将其标记为可用于将来的连接。“客户端线程”未关闭,客户端连接已关闭。你的问题还不清楚。请重申。@user985637,您可能希望选择一篇文章作为您的接受答案,这是SO.Socket.isClosed上的一个非常好的实践,当您关闭该套接字时,它将返回true。它不会告诉你对等方何时关闭了连接:EOS会这样做。好吧,你不需要做再见的事情和心跳的实现。TCP本身在关闭连接之前接受超时值,因此如果在此时间内没有收到任何信息,您可以结束连接。谢谢!这回答了我的问题。