nio程序问题:远程主机强迫关闭了一个现有的连接
来源:10-9 NIO服务器
Bill好想
2018-02-04
c老师您好,我的nio程序不知道为什么会报“远程主机强迫关闭了一个现有的连接”,我是windows,用的cmd的telnet连接上的,代码跟您的nio服务器代码一样,希望老师能帮我解惑~
并且使用windows的telnet输入文字时,会非常奇怪,输入完第一个字符后,服务器就已经处理了:
并且过不了多久,“远程主机强迫关闭了一个现有的连接”问题还会出现。
而使用Xshell就不会有“只读一个字符”的这种问题,但是“远程主机强迫关闭了一个现有的连接”问题仍存在:
============================================================
2018-2-16更新:
谢谢c老师,我重新试了一下,将代码中会抛出异常的地方,都catch了,然后打印出相关日志,结果频繁打印“远程主机强迫关闭了一个现有的连接”,目前原因还是不太明白,希望老师能抽空再帮我看看。
代码如下:
频繁死循环打印日志如下:
============================================================
2018-2-28更新
谢谢c老师的指点,加上了cancel和close果然服务端更健壮了,不会再死循环打印信息了~
我最终发现原因了:
原来迅雷的ThunderPlatform.exe进程会一直会向我的nio程序建立连接,但是其连接用不了几秒钟就会断开(肯定是个定时任务,具体要用8888端口来干什么就不清楚了),于是造成了如下的不相干日志,对我的程序造成了干扰:
2回答
-
抱歉回复的迟了。
这里一共有三个问题。
一:windows下的telnet会一个个字符读入的问题。
这个跟客户端有关系,解决的话需要自己记录每个connection进来的字符,看到换行符才处理。
二:会经常断线,说“远程主机强制关闭了一个现有连接”
我使用XShell没有出现这样的情况。可能是有哪个客户端在上面断了。
三:有客户断线后服务器会挂,导致其他所有客户都断
由于我们之前出于演示的目的只考虑了正确路径,这的确是一个问题。我们不论在windows还是linux都可以通过手动断开客户端来重现这个问题。加了try/catch后还会死循环输出远程主机强制关闭了一个现有连接。
一个快速的解决方法是在catch IOException之后,(更好的话,并且判断具体消息之后)把channel给关了。
这样就健壮一些。
122018-02-28 -
ccmouse
2018-02-05
的确存在这种情况。我们的这个程序只是概念性的演示,做了简化以达到了面试所需的理解。它的确离跨平台和健壮性还有距离。
telnet一个个字符输入,的确有这样的情况。要解决的话,需要自己记录每个connection进来的字符,看到换行符才处理。
远端关闭连接的问题,你可以看一下你的服务器还在吗,很可能服务器有一些exception,然后挂了,我们看一下是什么exception,然后catch掉,不要让它挂掉整个服务器。
如果要深入研究java nio,我们可以看一下Jetty文档。Jetty是一个使用Java nio的高性能服务器。https://www.eclipse.org/jetty/
132018-02-17
相似问题