0

私のコードは次のようになります。これはサーバー コードです ( Runnable)

public void run() {
    while (true) {
        try {
            System.out.println("Waiting for client...");
            this.socket = serverSocket.accept();
            System.out.println("Client accepted");
            while (true) {
                readCommand();
                try {
                    Thread.sleep(2);
                } catch (Exception e) {
                }
            }
        } catch (Exception ex) {
            Main.error("Server stopped for current host", ex);
        }
    }
}

私の問題は、クライアントが接続を閉じるとき、readCommand();コマンドが送信されてEOFExceptionスローされるまで、コマンドの読み込みを待機していることです。これは私のreadCommand方法です:

private void readCommand() throws Exception {
    Object o = new ObjectInputStream(socket.getInputStream()).readObject();
    if (o instanceof Command) {
        ((Command) o).execute();
        return;
    }
    if (o instanceof Recorder) {
        System.out.println("Recording received");
        ((Recorder) o).executeRecord();
        return;
    }
    if (o instanceof MyKeyEvent) {
        ((MyKeyEvent) o).execute();
        return;
    }
}

したがって、読む前に、接続が開いているかどうかを確認する必要があると思います。

編集:run -method コードを評価すると、EOFExceptionがスローされますtry-catch-body。しかし、彼はクライアントの受け入れをやめます。

4

2 に答える 2

3

EOFExceptionクライアントが接続を閉じた場合、まさに私が期待するものです。だから、あなたの問題が実際に何であるかはよくわかりません。おそらく、予想されるクライアントの切断と予想外のクライアントの切断を区別する必要があります。その場合、送信の終了を示す何らかのEnd-of-messageオブジェクトを送信する必要がありますか?

情報が利用可能かどうかを確認したい場合は、ストリームにavailable()メソッドがあります。データがない場合、有効な入力ストリームThread.sleep(2)の読み取りがハングすると予想されるため、ところで、必要はないと思います。

于 2009-10-12T18:44:33.313 に答える
0

別の try-catch を追加して、EOFException だけをキャッチすることもできます。

public void run() {
    while (true) {
        try {
            System.out.println("Waiting for client...");
            this.socket = serverSocket.accept();
            System.out.println("Client accepted");
            try {
                while (true) {
                    readCommand();
                    try {
                        Thread.sleep(2);
                    } catch (Exception e) {
                    }
                }
            } catch (EOFException ex) {
                System.out.println("client closed");
            }
        } catch (Exception ex) {
            Main.error("Server stopped for current host", ex);
        }
    }
}

確かに、コマンドの終了ははるかにスマート/エレガントです...
[]]

于 2009-10-12T19:45:41.990 に答える