Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TCP/IP服务器未正确关闭连接_Java_Sockets_Tcp_Ip_Lag - Fatal编程技术网

Java TCP/IP服务器未正确关闭连接

Java TCP/IP服务器未正确关闭连接,java,sockets,tcp,ip,lag,Java,Sockets,Tcp,Ip,Lag,我已经为Android手机创建了一个MMO,并使用带有TCP/IP套接字的Java服务器。一般来说,一切都很好,但在客户端登录和注销一天后,我的网络变得非常滞后——即使没有连接客户端。NETSTAT没有显示任何延迟的连接,但显然发生了严重的错误 如果我完全重新启动,一切都会奇迹般地恢复正常,但从长远来看,这不是一个站得住脚的解决方案。这就是我的断开连接方法(两端)的样子: _输入和_输出是从套接字派生的BufferedInputStream和BufferedOutputStream。根据文档,调

我已经为Android手机创建了一个MMO,并使用带有TCP/IP套接字的Java服务器。一般来说,一切都很好,但在客户端登录和注销一天后,我的网络变得非常滞后——即使没有连接客户端。NETSTAT没有显示任何延迟的连接,但显然发生了严重的错误

如果我完全重新启动,一切都会奇迹般地恢复正常,但从长远来看,这不是一个站得住脚的解决方案。这就是我的断开连接方法(两端)的样子:

_输入和_输出是从套接字派生的BufferedInputStream和BufferedOutputStream。根据文档,调用shutdownInput()和shutdownOutput()应该是不必要的,但我正在尽我所能来解决这个问题

我用默认设置实例化套接字——我不涉及soLinger、KeepAlive、noDelay或类似的东西。我在发送/接收时没有设置任何超时。我尝试过使用WireShark,但它没有显示任何异常,就像NETSTAT一样


我非常想知道这个问题的答案。我在这个项目上投入了大量的精力,对Java默认TCP实现中的一个严重隐藏缺陷感到失望。

去掉shutdownInput()和shutdownOutput()以及除BufferedOutputStream关闭之外的所有关闭,然后在finally块中关闭套接字本身作为皮带和支架。您正在关闭并关闭输出流之前的所有其他内容,这会阻止它刷新。关闭输出流将刷新输出流并关闭套接字。这就是你所需要的。

点击这里,无法对原始帖子发表评论

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

  • 我所说的“laggy”是指,无论是上行还是下行流量,连接速度都会变得非常慢。尝试加载网站或上传到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的头版大约需要一分钟,而我使用的正常速度测试(first hit Google speed test)甚至不会加载该页面。NETSTAT显示没有延迟连接。运行所有最新的防病毒程序。服务器在过去是全天候运行的,没有任何问题——只有当我开始在它上面运行这个Java服务器时,这种情况才开始发生


我应该补充一点,在没有活动的2分钟后,所有客户端都会断开连接。来自静默断开连接的客户端的锁定receive()线程没有问题。如果只是重新启动服务器进程而不是重新启动,会发生什么?哦,您可能想使用jvisualvm来监视内存使用和垃圾收集。内存不足的可能性远远大于使用套接字的任何情况,尤其是考虑到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);
    }
}