【发布时间】:2012-05-11 11:42:56
【问题描述】:
对ServerBootstrap.bind() 的调用返回一个Channel,但这不是Connected 状态,因此不能用于写入客户端。
Netty 文档中的所有示例都显示从其ChannelHandler 的事件(如channelConnected)写入Channel - 我希望能够在事件中而不是在事件之外获得连接的通道,让我们说一些使用我的服务器组件的客户端代码。一种方法是手动编写代码等待channelConnected 事件,然后复制 Channel 引用。但这可能是在重新发明轮子。
所以问题是:Netty 中是否有返回连接通道的阻塞调用?
编辑:我使用的是 Oio Channels,而不是 Nio。
【问题讨论】:
-
为什么?在客户连接之前,您无法获得通往客户的频道,这会作为连接事件出现在您身上。为什么你认为你需要另一种机制?为什么是阻塞机制?这没有任何意义。
-
我知道在客户端连接之前我无法获得连接的通道..这正是我提到阻塞的原因..可以说有一个外部接口需要一个连接的通道(用于编写一些东西)。服务器必须等待(阻塞)直到客户端连接并返回这个连接的通道..哪一部分没有意义?
-
没有任何意义。如果它是客户端连接,则不能强制它发生,您必须在入站连接事件到达时对其进行处理。您可能在谈论 outbound 连接吗?到另一个服务器?
-
它不是出站的。服务器确实在监听客户端的连接,他们最终会连接,也就是触发事件并建立连接的时候。但是服务器还必须为另一个对写入客户端感兴趣的外部接口(通过服务器)提供服务,并且它有自己的时间来请求通道..现在当这个外部接口调用服务器以获得连接的通道时,服务器有在客户端建立连接之前阻止此调用..这有帮助吗?
-
我想到了同步线程和阻塞队列的方法。如果 Netty 有任何类似于 java.net.ServerSocket 的东西(一个阻塞调用,它返回一个准备好用于写入的 Channel),那么我也可以使用那个 API。 - 这就是为什么我的问题..知道没有这样的 API 太糟糕了..