nio程序问题:远程主机强迫关闭了一个现有的连接

来源:10-9 NIO服务器

Bill好想

2018-02-04

c老师您好,我的nio程序不知道为什么会报“远程主机强迫关闭了一个现有的连接”,我是windows,用的cmd的telnet连接上的,代码跟您的nio服务器代码一样,希望老师能帮我解惑~

//img.mukewang.com/szimg/5a76b7570001870f08330343.jpg


并且使用windows的telnet输入文字时,会非常奇怪,输入完第一个字符后,服务器就已经处理了:

//img.mukewang.com/szimg/5a76b7ab0001134303780123.jpg

并且过不了多久,“远程主机强迫关闭了一个现有的连接”问题还会出现。

而使用Xshell就不会有“只读一个字符”的这种问题,但是“远程主机强迫关闭了一个现有的连接”问题仍存在:

//img.mukewang.com/szimg/5a76b8460001cfae04590442.jpg


============================================================

2018-2-16更新:

谢谢c老师,我重新试了一下,将代码中会抛出异常的地方,都catch了,然后打印出相关日志,结果频繁打印“远程主机强迫关闭了一个现有的连接”,目前原因还是不太明白,希望老师能抽空再帮我看看。

代码如下:

//img.mukewang.com/szimg/5a86e05d00019ee206670523.jpg

频繁死循环打印日志如下:

//img.mukewang.com/szimg/5a86e07c0001423104180715.jpg

============================================================

2018-2-28更新

谢谢c老师的指点,加上了cancel和close果然服务端更健壮了,不会再死循环打印信息了~

我最终发现原因了:

//img.mukewang.com/szimg/5a958946000186aa06350195.jpg


原来迅雷的ThunderPlatform.exe进程会一直会向我的nio程序建立连接,但是其连接用不了几秒钟就会断开(肯定是个定时任务,具体要用8888端口来干什么就不清楚了),于是造成了如下的不相干日志,对我的程序造成了干扰:

//img.mukewang.com/szimg/5a958a4800014fa104490413.jpg


写回答

2回答

ccmouse

2018-02-27

抱歉回复的迟了。

这里一共有三个问题。

一:windows下的telnet会一个个字符读入的问题。

这个跟客户端有关系,解决的话需要自己记录每个connection进来的字符,看到换行符才处理。

二:会经常断线,说“远程主机强制关闭了一个现有连接”

我使用XShell没有出现这样的情况。可能是有哪个客户端在上面断了。

三:有客户断线后服务器会挂,导致其他所有客户都断

由于我们之前出于演示的目的只考虑了正确路径,这的确是一个问题。我们不论在windows还是linux都可以通过手动断开客户端来重现这个问题。加了try/catch后还会死循环输出远程主机强制关闭了一个现有连接。

一个快速的解决方法是在catch IOException之后,(更好的话,并且判断具体消息之后)把channel给关了。

//img.mukewang.com/szimg/5a94c2e3000161b710460298.jpg

这样就健壮一些。


1
2
Bill好想
另外我找到那个诡异的原因了~ 原来是迅雷搞的鬼!我在问题中补充里贴了图片~
2018-02-28
共2条回复

ccmouse

2018-02-05

的确存在这种情况。我们的这个程序只是概念性的演示,做了简化以达到了面试所需的理解。它的确离跨平台和健壮性还有距离。

telnet一个个字符输入,的确有这样的情况。要解决的话,需要自己记录每个connection进来的字符,看到换行符才处理。

远端关闭连接的问题,你可以看一下你的服务器还在吗,很可能服务器有一些exception,然后挂了,我们看一下是什么exception,然后catch掉,不要让它挂掉整个服务器。

如果要深入研究java nio,我们可以看一下Jetty文档。Jetty是一个使用Java nio的高性能服务器。https://www.eclipse.org/jetty/

1
3
Bill好想
回复
ccmouse
哈哈,好的,谢谢c老师啦~
2018-02-17
共3条回复

Google面试官亲授-Java面试新手尊享课

为面试新手量身定制的Java面试尊享课,解锁“鲤鱼跃龙门”的妙招

2853 学习 · 180 问题

查看课程