0

ソケットプログラミングをしています。Server.java と client.java という 2 つのファイルがあります。両方のプログラムは正常に実行され、相互にデータを正常に送信していました。昨日、次の行を client.java ファイルに追加しました。

     //old line
     out.writeUTF(dbdata); //dbdata was written successfully and sent to the server program
     try
     {
          //my socket connection object name is sock
            String data1="1000";
            System.out.println(data1);
            out.writeUTF(data1);   this line causes the error
     }

     catch(Exception e)
     {
            System.out.println("Exception :: "+e);
     }

行 out.writeUTF(data1) が実行され、catch がそれをキャッチすると、例外が BROKEN PIPE として表示されます。

data1 を読み取る server.java の内容は次のとおりです。

     String data1;
     try
     {
            data1=in.readUTF();
     }
     catch(Exception e)
     {
            System.out.println("Server Exception :: "+e);
     }

また、out.writeUTF(data1) の前に isConnected() で接続が開いているかどうかを確認し、キャッチで例外が発生した後に isConnected() を実行しました。両方ともTrueのみを示しました。

4

2 に答える 2

1

@EJP そうですね。この例外は、書き込み呼び出しが完了する前、およびおそらく開始する前にソケットが閉じられたことを意味します。相手側に配信されたデータの量を知る方法はありません。

パズルのもう 1 つの部分は、なぜisConnected()が戻ってくるのかということですtrue。これは、次のように言うjavadocによって説明されています。

「注: ソケットを閉じても接続状態はクリアされません。つまり、このメソッドは、閉じられる前に正常に接続されていた場合、閉じられたソケットに対して true を返します (isClosed() を参照)。」

于 2012-09-22T11:29:24.353 に答える
1

「壊れたパイプ」は、もう一方の端で既に閉じられている接続に書き込んだことを意味します。つまり、アプリケーション プロトコル エラーです。軽減策は、不要なデータを書き込まないようにこの端を修正するか、必要なデータをすべて読み取るようにもう一方の端を修正することです。

于 2012-09-22T10:03:09.737 に答える