自定义Netty ServerChannel实现

时间:2012-01-24 18:21:59

标签: 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的任何指示?我发现这个区域缺少javadoc。

一些具体问题:

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

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

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

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

谢谢!

在有人问之前:是的,我很乐意用基于Netty的网络堆栈替换我们的自定义网络堆栈,但这是一项很大的工程任务,我很难证明这一点。宝贝步骤。

1 个答案:

答案 0 :(得分:10)

看起来,您正在尝试实现新的异步传输,因此值得查看NIO TCP transport Datagram 类除外)。

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

这将更容易如果你能理解Netty事件模型以及如何通过管道。这是我对其运作方式的理解。

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

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

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

<强> NioWorker   - 在通道的选择器事件(所有NioClientSocketChannel,NioAcceptedSocketChannel)上运行nio循环   - 从网络收到的数据:收到消防信息   - 轮询写入队列并执行非阻塞写入   - 轮询感兴趣的操作事件的任务队列并暂停/恢复频道?

<强>老板

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

<强> NioClientSocketPipelineSink

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

<强> NioServerSocketPipelineSink

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

我的实施应如何回应“InterestOps”类型的东西?

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

  

ServerChannel.write对于从堆栈中一直到来的消息的调用是什么?这两种不同的重载是什么?

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

ChannelFuture write(Object message);

ChannelFuture write(Object message, SocketAddress remoteAddress);

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

  

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

服务器渠道不需要支持这些方法调用,但您应该在此处实现bindunbind

  

我是否应该通过ServerBootstrap完成所有这些工作,或者对于这些内容来说是否太高级了?

服务器/客户端bootstraps只是帮助类来管理管道资源并提供绑定,连接和管理的外观。断开。你必须实现

中的大部分逻辑

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

然后你必须实现客户端&amp;服务器通道工厂使用上面的类,如果这些事情完成,你可以简单地设置你的服务器&amp;客户端使用Bootstrap类。