【发布时间】:2011-10-26 14:30:20
【问题描述】:
目前我正在开发 Java NIO 服务器(单线程)并且遇到了一些问题。服务器接受传入的连接,将初始数据包(数据包包含客户端用于进一步通信的一些数据)写入客户端,但不从中读取。服务器仅在我关闭客户端时尝试读取,当然,它返回 -1。
当接受连接时,它被注册在:
selectionKey = socketChannel.register(_selector, SelectionKey.OP_READ)
selectionKey.isReadable() 返回false(应该吗?)
在发送初始数据包之前,操作更改为:
_selectionKey.interestOps(_selectionKey.interestOps() | SelectionKey.OP_WRITE)
发送初始数据包后,操作更改为:
selectedKey.interestOps(selectedKey.interestOps() & ~SelectionKey.OP_WRITE)
数据包被发送。
可能是什么问题?会不会和客户有关?
【问题讨论】:
-
除非绝对必要,否则你不应该构建自己的 NIO 服务器,这并不简单,还有很多注意事项,请使用像 Netty 一样为你抽象复杂性的库(@987654321 @) 或米娜 (mina.apache.org)。
-
@MaurícioLinhares 根据我对 Netty 和 MINA 的了解,它们与 NIO 一样难以驾驶。
-
哇,这实际上是一个古老的问题,但它们与 NIO非常不同。新的 NIO API 实际上将 Netty/Mina 的一些抽象带入了 JDK,但它们与使用 Netty 之类的东西所获得的东西仍然相去甚远。
-
我不得不说,我将 Netty 视为我的服务器的一个选项(我仍然计划在未来使用它),但我发现它还没有对 NIO 有很好的了解Netty 看起来同样复杂。不过我真的很喜欢这个项目。