私は Android フォン用の MMO を作成し、TCP/IP ソケットを備えた Java サーバーを使用しています。通常はすべて正常に動作しますが、クライアントがネットワークにログオンしたりオフにしたりして約 1 日経過すると、クライアントが接続されていなくても、非常に遅延が発生します。NETSTAT は長引く接続を示していませんが、明らかに何かひどく間違っていることが起こっています。
完全に再起動すると、魔法のようにすべてが再びうまくいきますが、これは長期的には支持できる解決策ではありません. これは私の切断方法がどのように見えるかです(両端で):
public final void disconnect()
{
Alive = false;
Log.write("Disconnecting " + _socket.getRemoteSocketAddress());
try
{
_socket.shutdownInput();
}
catch (final Exception e)
{
Log.write(e);
}
try
{
_socket.shutdownOutput();
}
catch (final Exception e)
{
Log.write(e);
}
try
{
_input.close();
}
catch (final Exception e)
{
Log.write(e);
}
try
{
_output.close();
}
catch (final Exception e)
{
Log.write(e);
}
try
{
_socket.close();
}
catch (final Exception e)
{
Log.write(e);
}
}
_input と _output は、ソケットから生成された BufferedInputStream と BufferedOutputStream です。ドキュメントによると、shutdownInput() と shutdownOutput() を呼び出す必要はありませんが、これでできることはすべて投げています。
デフォルト設定でソケットをインスタンス化します。soLinger、KeepAlive、noDelay などには触れていません。送受信にタイムアウトを設定していません。WireShark を使用してみましたが、NETSTAT と同じように異常はありません。
私はこれについての答えをかなり切望しています。私はこのプロジェクトに多大な努力を払ってきましたが、Java のデフォルトの TCP 実装に隠された重大な欠陥のように見えることに不満を感じています。