6

readObject()だから、ソケットストリームからしようとするクライアント側にスレッドを書きました。

このスレッドは、クライアントが接続されている限り実行されます。

サーバーへの接続は、クライアントの GUI で閉じることができます。クライアントが「切断」メニュー オプションをクリックして切断することを決定した場合 (クライアント プログラムは終了しません)、ソケットは閉じられ、aisConnectedは false に設定されます。

クライアントはストリームからスレッドを読み取ろうとするためreadObject()、GUI を介して接続を閉じることができるため、タイムアウトを 250 ミリ秒に設定しました ( setSoTimeout(250))。

@Override
public void run()
{
  this.connection = this.connectionHandler.getSocket();
  while(connectionHandler.isConnected())
  {
    this.readCircle();
  }
  this.connectionHandler.setReadTaskRunning(false);
}

private void readCircle()
{
  try
  {
    this.connection.setSoTimeout(250);
    this.connectionHandler.readData(); //this uses readObject().
  }
 catch(SocketTimeoutException timeout){}
 catch(...){}

}

私はそれreadObject()がブロックされることを知っており、クライアントがまだ接続されているかどうかを確認するためにwhile、クライアントソケットがまだ接続されているかどうかを (タイムアウトごとに) チェックする でラップしました。

私の質問:

がサーバーから渡されたオブジェクトの取得を開始した場合、readObject()それを読み取ろうとしますが、処理中にタイムアウトが発生すると、ストリーム上のデータがキャンセルされたため、何らかの形で「破損」します。またはreadObject()、GUI スレッドがソケットを閉じたい場合は、ブロックを許可して例外をキャッチする必要があります。

私はソケットの経験があまりなく、おそらく私のアプローチはまったく間違っています。

4

1 に答える 1

2

ソケット読み取りタイムアウトにより、SocketTimeoutExceptionによって がスローされreadObject()ます。その を再利用できない可能ObjectInputStream性があり、現在の位置がほとんど未定義のままであるため、ストリームが破損する可能性があります。

これはおそらく、接続を閉じてから再度開くことによってのみ修正できます。

于 2013-02-21T10:23:25.833 に答える