请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

//img1.sycdn.imooc.com//szimg/5a76b7570001870f08330343.jpg


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

//img1.sycdn.imooc.com//szimg/5a76b7ab0001134303780123.jpg

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

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

//img1.sycdn.imooc.com//szimg/5a76b8460001cfae04590442.jpg


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

2018-2-16更新:

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

代码如下:

//img1.sycdn.imooc.com//szimg/5a86e05d00019ee206670523.jpg

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

//img1.sycdn.imooc.com//szimg/5a86e07c0001423104180715.jpg

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

2018-2-28更新

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

我最终发现原因了:

//img1.sycdn.imooc.com//szimg/5a958946000186aa06350195.jpg


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

//img1.sycdn.imooc.com//szimg/5a958a4800014fa104490413.jpg


正在回答

2回答

抱歉回复的迟了。

这里一共有三个问题。

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

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

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

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

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

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

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

https://img1.sycdn.imooc.com//szimg/5a94c2e3000161b710460298.jpg

这样就健壮一些。


1 回复 有任何疑惑可以回复我~
  • 提问者 Bill好想 #1
    非常感谢c老师的耐心解答!
    回复 有任何疑惑可以回复我~ 2018-02-28 00:43:46
  • 提问者 Bill好想 #2
    另外我找到那个诡异的原因了~ 原来是迅雷搞的鬼!我在问题中补充里贴了图片~
    回复 有任何疑惑可以回复我~ 2018-02-28 00:44:35
ccmouse 2018-02-05 22:35:41

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

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

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

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

1 回复 有任何疑惑可以回复我~
  • 提问者 Bill好想 #1
    C老师,我补充更新了一下catch后的相关问题信息,我一直在telnet中输入字符,一段时间后,就会必现我上述所描述的问题,希望老师能在有空的时候再帮我看看~~ 谢谢老师~ 祝老师新春快乐~
    回复 有任何疑惑可以回复我~ 2018-02-16 21:49:49
  • ccmouse 回复 提问者 Bill好想 #2
    好的,等我春节过后好好看一下。祝同学新年快乐
    回复 有任何疑惑可以回复我~ 2018-02-17 11:22:22
  • 提问者 Bill好想 回复 ccmouse #3
    哈哈,好的,谢谢c老师啦~
    回复 有任何疑惑可以回复我~ 2018-02-17 22:10:45
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信