0

重複の可能性:
java.net.SocketException: ソフトウェアが原因で接続が中止されました: recv に失敗しました

接続が終日有効で、クライアントがサーバーがメッセージを送信するのを待つクライアントサーバーペアを作成しようとしています。手順は次のとおりです。

  1. サーバーはポートを開き、接続をリッスンします
  2. クライアントが接続してデータを待つ
  3. しばらくしてから (おそらく数時間)、サーバーがクライアントにデータを送信します
  4. クライアントはデータを処理し、サーバーに返します
  5. 手順 3 と 4 を繰り返します

手順 1 ~ 4 は機能しますが、手順 3 を繰り返そうとすると、タイトルにエラーが表示されます。

これはクライアント側での私の方法です:

private static void waitForInput(SSLSocket sslsocket) throws IOException {
        do {
            try {
                ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream());
                ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getOutputStream());

                Object o = (Object) (ois.readObject());
                // excluded code to process data     

                oos.flush();
                oos.writeObject(o);
                oos.reset();
            }
            catch(ClassNotFoundException e){
                System.err.println(e.getMessage());
            }
        } while ( true );
    }

コードは 4 行目で失敗します。最初はブロックされ、データの次のビットを取得するまで待機しますが、2 回は機能しません。私は何を間違っていますか?

4

2 に答える 2

0

宣言を毎回再宣言する必要がないため、宣言をループの外に移動できます。その周りに必要になる場合oisoosあります。do ... whiletry ... catch

private static void waitForInput(SSLSocket sslsocket) throws IOException {
    ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream());
    ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getOutputStream());
    do {
        try {

            Object o = (Object) (ois.readObject());
            // excluded code to process data     

            oos.writeObject(o);
            oos.flush();
        }
        catch(ClassNotFoundException e){
            System.err.println(e.getMessage());
        }
    } while ( true );
}

そして、私は削除しoos.reset();て移動しましたoos.flush();

問題は、oos.reset();何時間も持続するはずの接続、または少なくともその一部をリセットすることは決してないと思います。

さらに、その接続にはすでに がありois、そのうちの 2 つは必要ありません。

于 2012-09-17T20:50:50.773 に答える
0

相手側で閉じられたソケットからの読み取りを待機しているときに、接続中止 IOException がスローされます。誤ってソケットを閉じていない場合は、サーバー側のコードを確認してください。また、サーバー側のコードをアップロードしてより深い分析を行うこともできます。また、スタック トレースを投稿してみてください。分析に役立ちます。

于 2012-09-17T20:24:57.213 に答える