0

我为 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 实现中看似严重的隐藏缺陷感到沮丧。

4

2 回答 2

2

摆脱 shutdownInput() 和 shutdownOutput() 以及除了 BufferedOutputStream 的关闭之外的所有关闭,以及作为带和大括号的 finally 块中的套接字本身的后续关闭。您正在关闭并在输出流之前关闭其他所有内容,这会阻止它刷新。关闭输出流会刷新它并关闭套接字。这就是你所需要的。

于 2010-12-04T00:40:02.497 回答
0

在这里,无法评论原始帖子。

  • 重新启动服务器进程似乎无法解决问题。即使在完全关闭服务器几分钟后,网络仍然非常“滞后”。

  • 通过“滞后”,我的意思是连接变得非常慢,无论是上行还是下行。尝试加载网站或上传到我的 FTP 非常缓慢,就像我使用 14.4k 调制解调器(我使用 15mbs 光纤)一样。互联网速度测试在这种状态下甚至都不起作用——当网站最终加载时,我收到一个关于找不到文件的错误。

  • 所有这些都会在重新启动后立即清除,并且只有在重新启动后才会清除。

  • 我按照 EJP 的建议修改了我的断开连接方法,但问题仍然存在。

  • 服务器在 Windows 7 安装、最新版本的 Java/Java SDK 上运行。服务器有 16gb 的 RAM,尽管我可能没有正确分配它以供 JVM 充分使用。似乎不存在任何杂散线程或进程。我会看看 JVISUALVM 怎么说。– jysend 13 分钟前

  • JVISUALVM 中没有什么异常——10mb 堆,50% 的 CPU 使用率,3160 个对象(预期),437 个活动线程中的 27 个已启动。服务器已运行约 18 小时;加载 CNN 的首页大约需要一分钟,而我使用的正常速度测试(首先点击谷歌搜索速度测试)甚至不会加载页面。NETSTAT 显示没有延迟连接。运行所有最新的防病毒软件。服务器过去一直 24/7 运行,没有任何问题——只有当我开始在它上面运行这个 Java 服务器时,这种情况才开始发生。

于 2010-12-08T02:03:15.447 回答