2

调用ServerBootstrap.bind()返回 aChannel但这不是Connected状态,因此不能用于写入客户端。

ChannelNetty 文档中的所有示例都显示了从它ChannelHandler的事件写入 a ,例如channelConnected- 我希望能够获得一个连接的 Channel 不是在事件中,而是作为事件外部的参考,让我们说一些使用我的服务器组件的客户端代码。一种方法是手动编写等待channelConnected事件的代码,然后复制 Channel 引用。但这可能是在重新发明轮子。

所以问题是:Netty 中是否有返回连接通道的阻塞调用?

编辑:我使用的是 Oio Channels,而不是 Nio。

4

2 回答 2

3

您可以创建一个阻塞调用,但我认为您过快地诋毁了基于事件的方法。这是一个人为的例子,只是为了确保我理解你想要做什么:

  1. Netty 服务器启动
  2. DataPusher服务启动。
  3. 当客户端连接时,DataPusher 获取对客户端通道的引用并向其写入一些数据。
  4. 客户端在连接后不久收到推送的数据。

或多或少正确?

为此,您的 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 的角度来看它是一个阻塞调用,只需让它等待一个闩锁并让仆从放下闩锁。

不知道这是否是你要找的......

于 2012-05-11T13:21:12.837 回答
1

经过以上所有的交流,我仍然认为没有任何必要。

当然,您所要做的就是接受来自外部服务的连接;不要为任何事件注册它;然后,当另一个客户端连接时,在两个通道上注册 I/O 事件。

外部服务不知道也不关心您是否被阻塞在等待另一个连接的线程中,或者只是由于其他原因而没有响应。

如果他正在写信给你,他的写无论如何都会成功,直到你的套接字接收缓冲区的大小,无论你是否阻塞,只要你实际上没有从他那里读。当该缓冲区填满时,他将阻塞,直到您读取其中一些为止。

如果他正在阅读你的信息,他会阻止直到你发送一些东西,而你在此期间所做的事情对他来说是不可见的。

所以我认为你只需要简化你的想法,让它更符合非阻塞 I/O 的美妙世界。

于 2012-05-11T13:10:54.497 回答