我是这样做的,不知对不对?

05-05-18 wangzheng99
谢谢banq先生的指点。

我是这样认为的:当SelectionKey被注册为OP_READ时,selector对SocketChannel进行监听,一旦有外界传来数据的事件发生,selector自动触发;当SelectionKey被注册为OP_WRITE时,Seletor不管Channel有无事件都触发。

于是我改写了您的代码,当Handler在处理send()行为时,若MessageQueue中的ResponseList没东西就不进行wait(),send()将SelectionKey改为OP_READ后空转一下,这样Reactor中的Selector就一直对Channel进行read监控。

另外我在Acceptor中将新上线的Client对应的SelectionKey与它的ID一一对应放入一个HashMap中。当我在服务器端应用层有信息要对某ID用户输入时,将其对应的SelectionKey改为OP_WRITE,再Selector.wakeup().

这样就可以进行即时的输入输出了,并且我在客户端也是用同样的方法实现的。可奇怪的是,客户端成功了--如我所愿(可随时得到消息,随时发出消息);而服务器端却失败了,在执行sk.interestOps(OP_WRITE)时线程死在这一句上了,就好象执行了wait()一样。直到Handler中的read()中的sk.interestOps(OP_WRITE)执行时,死住的那句才执行。

我很不理解为什么同样的实现,客户端成功,服务器端却失败,而且会有这么奇怪的问题发生!也许是我的理解有重大偏差!我是一名即将毕业的大学生,希望banq先生能帮我解难!

banq
2005-05-19 11:40
不用着急,是理解上有些偏差,我也久不碰这些底层的东西,进入有些难度,不知其它网友是否可以帮助你?

猜你喜欢