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 スレッドがソケットを閉じたい場合は、ブロックを許可して例外をキャッチする必要があります。
私はソケットの経験があまりなく、おそらく私のアプローチはまったく間違っています。