使用java多线程Server / Client,如何判断客户端线程是否已关闭?

时间:2011-10-08 18:14:13

标签: 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 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();
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

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

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

至于在线程之间共享变量,您可以参考:http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html