必威体育Betway必威体育官网
当前位置:首页 > IT技术

Java NIO服务器:远程主机强迫关闭了一个现有的连接

时间:2019-10-28 03:45:33来源:IT技术作者:seo实验室小编阅读:70次「手机版」
 

远程主机强迫关闭了一个现有的连接

java NIO聊天室 中,若客户端强制关闭,服务器会报“java.io.IOException: 远程主机强迫关闭了一个现有的连接。”,并且服务器会在报错后停止运行,错误的意思就是客户端关闭了,但是服务器还在从这个套接字通道读取数据,便抛出IOException,导致这种情况出现的原因就是,客户端异常关闭后,服务器的选择器会获取到与客户端套接字对应的套接字通道SelectionKey,并且这个key的兴趣是OP_READ,执行从这个通道读取数据时,客户端已套接字已关闭,所以会出现“java.io.IOException: 远程主机强迫关闭了一个现有的连接”的错误。解决这种问题也很简单,就是服务器在读取数据时,若发生异常,则取消当前key并关闭通道,如下代码

		//获取此key对应的套接字通道
		socketChannel channel = (SocketChannel) key.channel();
		//创建一个大小为1024k的缓存区
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		StringBuffer sb = new StringBuffer();
		//将通道的数据读到缓存区
		int count = 0;
		try{
			count = channel.read(buffer);
		}catch(IOException e){
			key.cancel();
			channel.socket().close();
			channel.close();
			return;
		}

因在catch中取消了key,readMsg返回后,run方法继续往下走,之前的代码会报“java.nio.channels.CancelledKeyException”错误,所以需要判断当前key是否有效,

之前的代码:

						//若此key的通道的行为是"读"
						if (key.isReadable()) {
							readMsg(key);
						}
						//若次key的通道的行为是"写"
						if (key.isWritable()) {
							writeMsg(key);
						}
修复后的代码:
						//若此key的通道的行为是"读"
						if (key.isvalid() && key.isReadable()) {
							readMsg(key);
						}
						//若次key的通道的行为是"写"
						if (key.isValid() && key.isWritable()) {
							writeMsg(key);
						}
这样改良之后的聊天室服务端,客户端异常强制关闭后,服务器便会妥善处理了,也不会报错,更不会停止运行。改良之后还算比较稳定运行的。

文章最后发布于: 2014-06-08 01:51:49

相关阅读

分享一个自己做的截图小工具(基于Windows平台的批处理

最近项目中要有截图的工作要做,对于我等使用AS的开发人员来说,视频或者截图借用工具也是分分钟的事情,但是公司的业务同事和测试人员

一个在落伍混快了4年非职业站长来说说落伍

此文于本人就自己的观点发表.落伍.admin5同时发布!给我写本文的来源:于2007-8-11晚和一个资深的落伍老会员交流有感才写的此文呢!此

李子柒、张大奕、黎贝卡…头部网红转战闲鱼,流量焦虑时

为什么是闲鱼?不过,并非所有二手电商平台都可以承接网红,让他们有空间生长。对于网红们来说,首先需要解决的是流量问题;其次,是拥有一

一个被忽视的小点——函数的单调性

文章目录关于函数单调性的定理定理6.3定理6.4推论注意!!小点在这里例题解答关于函数单调性的定理 定理6.3 fff在III上可导 fff在II

少改稿秘诀!如何确定一个产品的主视觉风格?(附实战演示)

关于一个APP,或者是一个互联网产品的视觉风格和主题颜色是怎么确定的,其实是有一套系统方法论的。这个方法论叫做:情绪板(Mood Board)

分享到:

栏目导航

推荐阅读

热门阅读