-1

サーバーが最初にメッセージを送信し、クライアントから応答を受信して​​から、再び同じことを行う、TCP クライアントとサーバー間の 4 方向メッセージ交換を実装しようとしています。これは、さらに多くのメッセージに拡張できます。両方の接続を開いたままにするにはどうすればよいですか? 無限 while ループが必要な場合、どこに配置しますか? クライアント側でこれを試してみましたが、エラーが発生しました。ここのサーバーは気にしません!

// open socket

while(true) {
// read
// send reply
}

clientSocket.close();

問題は、サーバーから送信された同じメッセージに対してバッファーが 2 回読み取られ、次のエラーが発生することです。

Exception in thread "main" java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.write(Unknown Source)
at java.io.FilterOutputStream.write(Unknown Source)
at TCPClient.main(TCPClient.java:52)
4

1 に答える 1

2

明らかに、これは TCP サーバー ハンドシェイクではなく、アプリケーション固有のレイヤー 7 ハンドシェイクです。ソケットを接続すると、すでに 3 ウェイ ハンドシェイクが実行されており、ソケットが接続されています。その上で行うことは、信頼できる方法でデータを交換するだけです。

質問に戻ると、スローされている例外は、ソケットサーバーに書き込むことができないことを明確に示しています。

なんで?複数の理由が考えられます:

  1. ソケット サーバーが本来の動作をしていません。
  2. たとえば、最初の書き込みの後、ループでソケットオブジェクトへの追跡を失い、nullオブジェクトへの書き込みなどを行っている可能性があります。

もっと詳しく説明するか、自分で試してみてください。頑張ってください。

于 2013-07-05T14:44:01.150 に答える