4

サーバー(サーバーA)で実行されているプログラムがあり、1つのポートで外部接続(外部サーバーBから)をリッスンし、別のポートで同じサーバー(サーバーA)の内部接続をリッスンします。次に、内部接続から外部接続にデータを渡し、再び元に戻します。

クライアント外部が切断されたことを検出できる方法があるかどうか知りたいです。一度に必要な外部接続は 1 つだけですが、外部クライアントが再起動した場合などに新しい接続を受け入れることができるようにしたいと考えています。

このソケット レベルのものはすべて私にとってまったく新しいものなので、これを行うためのより良い方法があれば、私はすべて耳を傾けます。1 つの規定は、サーバー 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());
        }
    }
}
4

1 に答える 1