Я создал MMO для телефона Android и использую сервер Java с сокетами TCP / IP. В целом все работает нормально, но примерно через день, когда клиенты входят в систему и выходят из нее, моя сеть становится крайне медленной - даже если клиенты не подключены. 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.
Я довольно отчаянно нуждаюсь в ответах на этот вопрос. Я вложил много усилий в этот проект и разочарован тем, что кажется серьезным скрытым недостатком в реализации TCP по умолчанию в Java.