自定义Netty ServerChannel实现

Jos*_*ner 1 netty

我有两个我想要集成的系统,一个使用完全内部网络堆栈,另一个(特别是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如何实现的任何指针?我发现javadocs在这方面相当缺乏.

一些具体问题:

  • 我的实现应如何回应"InterestOps"类型的东西?

  • ServerChannel.write是什么叫做一直到堆栈的消息?这两种不同的重载是什么?

  • 我如何实现ServerChannel.(dis)connect?

  • 我是否仍然应该通过ServerBootstrap完成所有这些工作,或者这个东西是否太高级?

谢谢!

在有人要求之前:是的,我很乐意用基于Netty的网络堆栈替换我们的自定义网络堆栈,但这是一项庞大的工程任务,我很难理所当然.宝贝的步骤.

Jes*_*jan 10

看起来,你正在尝试实现一个新的异步传输,所以值得看看NIO TCP传输(除了数据报类).

我不确定它有多相关,但它将有助于理解如何为Netty编写新的传输服务(因为您已经询问过服务器,客户端通道,工厂等)

它会更容易如果你能理解Netty事件模型以及如何通过管道.这是我对其工作原理的理解.

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

  • 下游事件从上一个下游处理程序开始,并通过管道发送并接收ChannelSink,通道接收处理事件并采取操作或将消息放在通道的队列中.

更详细地说,(我假设,有人正在寻找Nio TCP传输类来为Netty编写自定义传输).

NioWorker - 关于通道的选择器事件(所有NioClientSocketChannel,NioAcceptedSocketChannel),运行nio循环 - 从网络接收的数据:收到的消息消息 - 轮询写入队列并执行非阻塞写入 - 感兴趣的op事件的轮询任务队列并暂停/恢复这个频道?.

老板

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

NioClientSocketPipelineSink

  • 有一个工作线程池执行器.
  • 在构造函数中将NioWorker runnables提交给工作线程池.
  • 客户端通道下游事件在此处下沉并放入通道写入队列/任务队列,拦截某些上游状态事件并管理通道的状态.

NioServerSocketPipelineSink

  • 有老板线程池.
  • 在创建时将Nio worker runnables提交给执行者.
  • 使用ServerSocketChannel将boss runnable提交给bind事件的执行者.
  • 服务器通道下游事件在此处下沉,拦截一些上游状态事件并管理ServerSocketChannel状态.

我的实现应如何回应"InterestOps"类型的东西?

它取决于通道的性质(阻塞/非阻塞)和约束.

ServerChannel.write是什么叫做一直到堆栈的消息?这两种不同的重载是什么?

服务器通道不需要支持那些方法调用,我想你指的是Channel的

ChannelFuture write(Object message);

ChannelFuture write(Object message, SocketAddress remoteAddress);
Run Code Online (Sandbox Code Playgroud)

这些方法用于无连接传输.对于TCP,两者实际上都在做同样的事情.

我如何实现ServerChannel.(dis)connect?

服务器通道并不需要支持这些方法调用,但你应该执行,bindunbind在这里.

我是否仍然应该完成所有这些工作ServerBootstrap,或者对于这些东西来说太高级了?

服务器/客户端引导只是帮助类来管理管道资源并提供绑定,连接和断开的外观.你必须实现大部分逻辑

客户端,服务器通道Impls
客户端,服务器管道下沉
老板,工人类,

然后你必须使用上面的类来实现客户端和服务器通道工厂,如果完成这些工作,你可以使用Bootstrap类简单地设置服务器和客户端.