ServerBootstrap.bind()
上的通话会返回Channel
,但这不是Connected
状态,因此无法用于写入客户端。
Netty文档中的所有示例都显示从Channel
的{{1}}事件中写入ChannelHandler
- 我希望能够在事件中获得已连接的频道但作为事件之外的参考,让我们说一些使用我的服务器组件的客户端代码。一种方法是手动编码等待channelConnected
事件,然后复制频道参考。但这可能是重新发明轮子。
所以问题是:Netty中是否有可以返回连接频道的阻止呼叫?
编辑:我使用的是Oio频道,而不是Nio。
答案 0 :(得分:3)
你可以创建一个阻止调用,但我认为你过快地对基于事件的方法进行了诽谤。这是一个人为的例子,只是为了确保我理解你要做的事情:
或多或少正确?
为此,可以在您创建的服务器管道中将DataPusher(或更好的,其中一个小兵)注册为ChannelHandler。延长org.jboss.netty.channel.SimpleChannelHandler。处理程序可能如下所示:
DataPusher dataPusher = getMyDataPusherReference();
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
dataPusher.doYourThing(e.getChannel()); // do something in another thread....
}
如果您决定从DataPusher的角度进行阻止调用,只需让它等待一个锁存器并让minion掉落锁存器。
不确定这是否是您正在寻找的......
答案 1 :(得分:0)
在上述所有交流之后,我仍然没有看到任何这些是必要的。
当然,您只需接受来自外部服务的连接;不要为任何活动注册;然后,当另一个客户端连接时,在两个通道上注册I / O事件。
外部服务不知道或不关心您是否在等待另一个连接的线程中被阻止,或者由于某些其他原因而没有响应。
如果他正在给你写信,他的写作无论如何都会成功,达到你的套接字接收缓冲区的大小,无论你是否阻止,只要你实际上没有从他那里读书。当缓冲区填满时,他会阻塞,直到你读完一些。
如果他正在给你读书,他会阻止你发送一些东西,而在此期间你正在做的事情对他来说是不可见的。
因此,我认为您只需要简化您的思路,并将其与非阻塞I / O的精彩世界更加一致。