在Android中存在OP_WRITE时,Java nio OP_READ是否未执行?

时间:2013-03-04 02:58:41

标签: java android multithreading networking nio

我正在尝试使用NIO在Android中编写服务器。 我的ServerChannel被接受后,我已经注册了OP_READ,OP_WRITE。

然而,在我做之后,有线的东西是......在while循环中:

SelectionKey key = (SelectionKey) iterator.next();
iterator.remove();

中的:

if(key.isReadable()){
} else if(key.isWritable()){

似乎isReadable永远不会返回true。

我的客户端代码是两个线程,一个用于读取的线程和另一个用于写入的线程。 我想知道为什么会这样......?我想如果有人能给我一些Java NIO中客户端处理的参考,那会很有帮助。

非常感谢,

2 个答案:

答案 0 :(得分:3)

您通常不应注册OP_WRITE。它几乎总是准备好了。您应该只在获得短写入结果时使用它,这表示发送缓冲区已满。另一方面,OP_READ仅在发送缓冲区中有数据时才准备好。在你的回答中没有任何内容表明在有问题的时刻存在。我想知道你是否在某种程度上不会让这些状态回到精神状态。

答案 1 :(得分:0)

我在理解.register方法时犯了错误,正确的方法是:

client.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);

虽然我做的是:

client.register(selector, SelectionKey.OP_READ);
client.register(selector, SelectionKey.OP_WRITE);

因此后者取代了前者。