java - 如何检测客户端何时与服务器断开连接

标签 java sockets

我有一个在服务器(服务器 A)上运行的程序,它在一个端口上监听外部连接(来自外部服务器 B),然后在另一个端口上监听同一服务器(服务器 A)上的内部连接.然后它将数据从内部连接传递到外部连接,然后再返回。

我想知道是否有一种方法可以检测到外部客户端已断开连接。我一次只需要一个外部连接,但我希望能够在外部客户端重新启动或类似情况时接受一个新连接。

这个套接字级别的东西对我来说都是相当新的,所以如果有更好的方法来解决这个问题,我会洗耳恭听。一个规定是服务器 B 上运行的客户端必须是发起连接的客户端,并且连接必须尽可能长地存在。

public void handleConnection() {
    System.out.println("Waiting for client message...");
    try {
        SSLSocket extSocket = (SSLSocket) this.externalServerSocket.accept();

        ObjectInputStream externalOis = new ObjectInputStream(extSocket.getInputStream());
        ObjectOutputStream externalOos = new ObjectOutputStream(extSocket.getOutputStream());
        System.out.println("Client connection establisthed");
        // Loop here to accept all internal connections
        while (true) {

            SSLSocket internalSocket = (SSLSocket) this.internalServerSocket.accept();
            new ConnectionHandler(externalOis, externalOos, internalSocket);

        }
    } catch (IOException e) {
        System.err.println(e.getMessage());
        return;
    }
}

class ConnectionHandler implements Runnable {
    private SSLSocket internalSocket;

    private ObjectOutputStream internalOos;
    private ObjectInputStream internalOis;

    private ObjectInputStream externalOis;
    private ObjectOutputStream externalOos;

    public ConnectionHandler(ObjectInputStream externalOis,
            ObjectOutputStream externalOos, SSLSocket internalSocket) {

        this.internalSocket = internalSocket;

        try {
            this.internalOis = new ObjectInputStream(this.internalSocket.getInputStream());
            this.internalOos = new ObjectOutputStream(this.internalSocket.getOutputStream());

            this.externalOis = externalOis;
            this.externalOos = externalOos;

        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
        new Thread(this).start();
    }

    @Override
    public void run() {
        try
        {

          // process data
          Object o = internalOis.readObject();
            externalOos.writeObject(o);
            Object o2 = externalOis.readObject();
            internalOos.writeObject(02);

            internalOos.close();
            internalOis.close();

            this.internalSocket.close();

        } catch (IOException e) {
            System.err.println(e.getMessage());
        } catch (ClassNotFoundException e) {
            System.err.println(e.getMessage());
        }
    }
}

最佳答案

如果客户端断开连接,readObject()会抛出EOFExceptionwrite()会抛出IOException: connection reset 。这就是您所需要的。

关于java - 如何检测客户端何时与服务器断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12710909/

相关文章:

java - 设置 Java 文本框中的文本颜色

java - 使用两个线程按顺序使用自定义锁定打印编号,其中一个线程打印偶数,另一个线程打印奇数

Java自然归并排序实现

python - 使用线程时的套接字问题

c - 如何在 Linux 内核中注册 UDP 端口并为此端口范围创建 Hook

python - 键盘中断、套接字和线程

java - 如何在aws上继续运行java应用程序?

Java 通过 TCP 发送对象

java套接字。服务器如何知道客户端关闭流

c - 在 Linux 中通过 RAW 套接字重新发送数据包