自定义Netty ServerChannel实现

3
我有两个系统需要整合,一个完全使用内部的网络堆栈,另一个(具体而言是Flazr)则使用Netty。我想通过我们内部的HTTP堆栈代理Flazr基于Netty的RTMP流,从而获得一个支持RTMPT的系统。
为了实现这一点,我需要一个像套接字一样的Netty对象,但允许我自己做所有“低级”工作 - 基本上只需用HTTP包装数据并将其传递到我们自定义的网络堆栈中。换句话说,我不希望Netty为我管理任何套接字 - 我想在套接字和Netty之间插入自己的东西。
我怀疑正确的方法是扩展AbstractServerChannel并创建一个*Factory类,但我不确定Netty的其余部分希望数据如何通过ServerChannel流动。
我的自定义ServerChannel需要能够:
- 通过我们现有的HTTP系统通知Netty新客户端连接 - 当数据到达时向Netty推送数据 - 在客户端请求时从Netty轮询新消息 - 当HTTP会话超时(或RTMP流被干净地关闭)时清除Netty状态
对于如何实现ServerChannel、ServerChannelFactory有什么建议吗?我发现javadoc在这个领域相当缺乏。
具体问题如下:
- 我的实现应该如何响应类似“InterestOps”之类的内容? - 对于从整个堆栈到达的消息,ServerChannel.write是否被调用?两种不同的重载是什么情况? - 我需要如何实现ServerChannel.(dis)connect? - 我是否仍然应该通过ServerBootstrap完成所有这些操作,还是那太高级了?
谢谢!在有人问之前:是的,我很想用基于Netty的定制网络堆栈替换我们的网络堆栈,但这是一个大型的工程任务,我很难为其辩护。
1个回答

11

看起来你正在尝试实现一种新的异步传输方式,因此值得一看NIO TCP transport(而不是Datagram类)。

我不确定它有多相关,但这将有助于了解如何为Netty编写新的传输服务(因为你已经问到了服务器、客户端通道、工厂等所有内容)

如果你能理解Netty事件模型以及如何通过管道进行处理,那么这将更容易。以下是我对其工作原理的理解:

  • 上游事件(来自网络的事件)从Channel/ServerChannel、Boss/NioWorker开始并通过管道发送,直到到达最后一个处理程序。

  • 下游事件从最后一个下游处理程序开始,并通过管道发送并沉淀在ChannelSink处,通道沉淀处理事件并采取行动或将消息放入通道队列中。

更详细地说,(我假设有人正在查看Nio TCP传输类以编写他们自己的Netty自定义传输)。

NioWorker - 在选择器事件上运行通道(所有NioClientSocketChannel,NioAcceptedSocketChannel),运行nio循环。 - 从网络接收数据:触发消息接收。 - 轮询写队列并进行非阻塞写操作。 - 轮询任务队列以获取感兴趣的操作事件,并暂停/恢复通道?。

Boss

  • 运行服务器NIO事件循环。
  • 接受客户端套接字,创建NioAcceptedSocketChannel,并为NioWorker注册选择器

NioClientSocketPipelineSink

  • 具有工作线程池执行器。
  • 在构造函数中提交NioWorker可运行对象到工作线程池。
  • 客户端通道下行事件在此处下沉,并放入通道写入队列/任务队列,拦截一些上游状态事件并管理通道的状态。

NioServerSocketPipelineSink

  • 具有boss线程池。
  • 在创建时将Nio worker可运行对象提交到执行器。
  • 在绑定事件上向执行器提交带有ServerSocketChannel的boss可运行对象。
  • 服务器通道下行事件在此处下沉,拦截一些上游状态事件并管理ServerSocketChannel状态。

我的实现应该如何响应“InterestOps”类型的内容?

这取决于通道的性质(阻塞/非阻塞)和限制条件。

ServerChannel.write是用于完全下传消息的吗?两种不同的重载方法有什么区别?

服务器通道不需要支持这些方法调用,我认为您指的是通道的方法。

ChannelFuture write(Object message);

ChannelFuture write(Object message, SocketAddress remoteAddress);

这些方法用于无连接传输。对于TCP,它们实际上做的是相同的事情。
“我需要如何实现ServerChannel.(dis)connect?”
服务器通道不需要支持这些方法调用,但您应该在此处实现 bindunbind
“我是否仍然需要通过ServerBootstrap执行所有这些操作,还是这太高级了?”
服务器/客户端引导程序只是管理管道资源并提供绑定、连接和断开连接的门面的帮助器类。大部分逻辑都必须在以下类中实现:
客户端,服务器通道实现
客户端,服务器管道接收器
Boss,Worker类,
然后,您必须使用上述类实现客户端和服务器通道工厂,如果完成了这些事情,则可以使用引导程序类简单地设置服务器和客户端。

1
我假设这与netty 3.x.x有关,在涉及传输实现时,netty 4.x.x的代码将完全改变。 - Ankur Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接