我为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实现中存在严重的隐藏缺陷感到沮丧。
答案 0 :(得分:2)
摆脱shutdownInput()和shutdownOutput()以及除了BufferedOutputStream的关闭之外的所有关闭,以及随后关闭套接字本身在finally块中作为带&括号。您正在关闭并关闭输出流之前的所有其他内容,以防止它被刷新。关闭输出流会将其刷新并关闭套接字。这就是你所需要的一切。
答案 1 :(得分:0)
重新启动服务器进程似乎无法解决问题。在完全关闭服务器几分钟后,网络仍然非常“滞后”。
“滞后”是指上下流量的连接速度极慢。试图加载网站,或上传到我的FTP,是非常缓慢的,就像我在一个14.4k调制解调器(我用15mbs光纤)。 Internet速度测试在处于此状态时甚至不起作用 - 当网站最终加载时,我收到有关未找到文件的错误。
所有这些都会在重新启动后立即清除,并且只有在重新启动后才会清除。
我按照EJP的建议修改了我的断开连接方法,但问题仍然存在。
服务器在Windows 7安装,最新版本的Java / Java SDK上运行。服务器有16GB的RAM,虽然我可能没有正确分配它让JVM完全使用。似乎不存在杂散线程或进程。我会看到JVISUALVM所说的内容。 - jysend 13分钟前
JVISUALVM中没有任何异常 - 10mb堆,50%CPU使用,3160个对象(预期),437个活动线程中的27个已启动。服务器已经运行了大约18个小时;加载CNN的头版需要大约一分钟,我使用的正常速度测试(首次点击谷歌搜索速度测试)甚至不会加载页面。 NETSTAT显示没有挥之不去的连接。全部保持最新的杀毒软件。服务器过去每周7天,每天24小时运行,没有任何问题 - 只有当我开始在其上运行这个Java服务器时,才开始发生这种情况。