我有一个Android应用程序充当服务器,并通过TCP以任意间隔(5-60秒内)从传感器提供一些数据。客户端应用程序偶尔会通过同一连接发送小块数据。必须毫不拖延地发送和接收数据。
所有示例和教程(如此http://adblogcat.com/asynchronous-java-nio-for-dummies/)都显示或多或少相同的情况 - 阅读完成后,切换到OP_WRITE。写入完成后切换到OP_READ,依此类推。 显然它对我的情况不起作用。我尝试过像这样启用读取和写入
serverChannel.register(selector, SelectionKey.OP_READ|SelectionKey.OP_WRITE);
但它会使选择器循环不断地加载CPU。
我确定这个问题不是很正确,所以即使有人给我完全不同但有工作的想法或指出我错了,我也会很高兴。 我没有发布代码,因为它几乎与上述教程相同。
答案 0 :(得分:3)
您的问题以及您引用的样本均基于谬误。 没有这样的东西作为'模式'在NIO。你可以随时阅读和书写,但如果在错误的时间完成,他们都可以做任何事情。
write()
返回零时,注册OP_WRITE的通道,记住您正在编写的缓冲区,然后返回到选择循环。互联网上有很多垃圾,在NIO方面尤其如此。你引用的众多问题(在这种材料中一遍又一遍地看到):
select()
不是异步的; Selector
' s'许可'写; finishConnect()
可以返回false; write()
可以返回零,或者小于提供的数据量; isConnectionPending()
为真时触发。