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对下一次的请求就失去了响应。
猜测原因:不明原因。
改进方案:目前无