我已经为Android手机创建了一个MMO,并使用带有TCP/IP套接字的Java服务器。一切正常,一切正常,但大约一天的客户端登录和离开我的网络变得非常滞后 - 即使没有连接客户端。 NETSTAT没有显示任何连接,但显然有一些可怕的错误发生。Java TCP/IP服务器关闭连接不正确
如果我重新启动一切,神奇的一切都会好起来,但这不是一个长期成功的解决方案。这是我的脱节方法看起来像(两端):
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实现中看起来严重的隐藏缺陷感到沮丧。
我应该补充说,2分钟没有活动后,所有的客户端都会断开连接。从静默断开连接的客户端锁定receive()线程没有问题。 – jysend 2010-12-03 19:30:35