Я создал 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.