java NIO服务器搭建问题集合

2013年1月,在即将大学毕业找工作期间,本人闲来无事决定在感兴趣的html5有一定斩获,于是开始写一个websocket的服务端程序。一下就是遇到的一些问题以及探讨。


采用的是jdk6

使用NIO,并准备协助使用线程池管理链接的读写。


在写最初的模型实现的时候,发现了很多问题。

首先,起初的想法是用一个selector管理所有的连接,每一个连接有需要进行数据读取的时候将SocketChannel实例传入一个线程进行读写操作。于是遇到了问题一:


问题一:如果直接把SocketChannel传入线程,并且异步的进行再次删选,那么就会出现在线程还没有操作Channel之前Selector再一次select到了这个Channel需要进行读操作。

猜测原因:只有在channel开始读数据之后,selectorKey才会标识这个channel已经被处理。

改进方案:在把channel实例传入线程之后那selectorKey的interestOps改成0,在线程处理完之后再改回该兴趣的操作。于是出现了问题二:


问题二:虽然不会出现多次操作同一个请求的情况了,但是由于把感兴趣操作改为0了,并且进入selector的select阻塞之后,改回感兴趣操作却变得不敏感了。也就是说进入select阻塞之后改Ops没有效果,默认还是0,于是该Channel对下一次的请求就失去了响应。

猜测原因:不明原因。

改进方案:目前无

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值