我为 Android 手机创建了一个 MMO,并使用了一个带有 TCP/IP 套接字的 Java 服务器。一切通常都很好,但是在客户端登录和注销大约一天后,我的网络变得非常迟钝——即使没有连接客户端。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 实现中看似严重的隐藏缺陷感到沮丧。