Netty:阻止呼叫以获得连接的服务器频道?

时间:2012-05-11 11:42:56

标签: java netty

ServerBootstrap.bind()上的通话会返回Channel,但这不是Connected状态,因此无法用于写入客户端。

Netty文档中的所有示例都显示从Channel的{​​{1}}事件中写入ChannelHandler - 我希望能够在事件中获得已连接的频道但作为事件之外的参考,让我们说一些使用我的服务器组件的客户端代码。一种方法是手动编码等待channelConnected事件,然后复制频道参考。但这可能是重新发明轮子。

所以问题是:Netty中是否有可以返回连接频道的阻止呼叫?

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

2 个答案:

答案 0 :(得分:3)

你可以创建一个阻止调用,但我认为你过快地对基于事件的方法进行了诽谤。这是一个人为的例子,只是为了确保我理解你要做的事情:

  1. Netty Server启动
  2. DataPusher 服务启动。
  3. 当客户端连接时,DataPusher会抓取对客户端通道的引用并向其写入一些数据。
  4. 客户端在连接后不久就会收到推送的数据。
  5. 或多或少正确?

    为此,可以在您创建的服务器管道中将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的精彩世界更加一致。