我正在尝试使用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中客户端处理的参考,那会很有帮助。
非常感谢,
答案 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);
因此后者取代了前者。