0

以下のコードに似たコードがあります。私が抱えている問題は、ObjectInputStream (入力変数) がオブジェクトを読み取ろうとすると (接続が確立された後にのみ発生します)、クラッシュしてエラーが発生することです:

java.net.SocketException: 接続のリセット

そして、次の行を参照します。

メッセージ = (文字列) input.readObject();

クライアントが切断された場合にのみそこに行くべきであるときに、ex例外ループに入ります(私の知る限り)。

    @Override
    public void run() {

        String message = "";

        do{
            try{
                message = (String) input.readObject();
            }catch(ClassNotFoundException cnfException){
                System.err.println("Unable to read client data.");
            }catch(Exception ex){ // Will get called if the client is no longer in communication with the server.
                continueTalking = false; // If the client disconnects, the server will shut down its communication with the client.
                ex.printStackTrace();
                break; // Breaks out of the do...while loop.
            }

            if(message.equals("DISCONNECT")){
                continueTalking = false;
                System.out.println(connection.getLocalAddress() + " disconnected from the session.");
            }
            else{
                //TODO Send the message off to be processed.
            }
        }while(continueTalking); // Continues waiting for a message until continueTalking = false

        closeStreams();
    }

ありがとうございました!

更新:私はそれを理解しました。私はもともと EOFException を試しましたが、何らかの理由で呼び出されませんでした。最終的に、実際にはデータを送信しておらず、実行するとすぐに切断されたのはクライアント側の問題であることがわかりました。私と同じ問題を経験している人のために、ここに私の修正コードがあります:

    /** This should handle the connection **/
    @Override
    public void run() {

        /** The message that the client has sent to the server. **/
        String message = "";

        do{
            try{
                message = (String) input.readObject(); // Waits for the client to send a message to the server.
            }catch(ClassNotFoundException cnfException){
                System.err.println("Unable to read client data. Continuing on with my life.");
            }catch(Exception noConnectionToSocketFound){ // Will get called if the client is no longer in communication with the server.
                System.out.printf("User with handle: %s disconnected.\n", clientIP);
                continueTalking = false; // If the client disconnects, the server will shut down its communication with the client.
                break; // Breaks out of the do...while loop that is constantly waiting for the client to send a message to.
            }

            /** If the client sends the message "DISCONNECT", then the server will shut down all communications with said client. **/
            if(message.equals("DISCONNECT")){
                System.out.println(connection.getLocalAddress() + " disconnected from the session properly.");
                continueTalking = false; // If the client wants to disconnect, then the server will stop trying to communication with said client.
                break; // Breaks out of the do...while loop that is constantly waiting for the client to send a message to.
            }
            else if(message != ""){
                System.out.printf("Got message from %s:\n%s\n", clientIP, message);
                message = ""; // Is needed so that this loop doesn't get called every time after the first message has been sent. Without it, after the word "cheeseburger" is sent, it would continually think that "cheeseburger" is being repeatedly sent (this might not actually happen anymore).
                //TODO Send the message off to be processed.
            }

        }while(continueTalking); // Continues waiting for a message until continueTalking = false

        closeStreams(); // Just some clean up

continueTalking = false;
break;

少し冗長で不必要かもしれません (実際に必要なのはそのうちの 1 つだけです)。

お役に立てれば!

4

1 に答える 1

0

「接続のリセット」には多くの原因が考えられますが、最も一般的な原因は、ピアによってすでに閉じられている接続に書き込んだことです。つまり、アプリケーションプロトコルエラーです。

ループはEOFException個別にキャッチし、整然としたクローズとして扱う必要があります。

于 2013-02-20T03:55:10.137 に答える