我有两个系统我想整合,一个使用完全内部网络堆栈,另一个(特别是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的网络堆栈替换我们的自定义网络堆栈,但这是一项很大的工程任务,我很难证明这一点。宝贝步骤。
答案 0 :(得分:10)
看起来,您正在尝试实现新的异步传输,因此值得查看NIO TCP transport( Datagram 类除外)。
我不确定它有多相关,但它将有助于理解如何为Netty编写新的传输服务(因为您已经询问过服务器,客户端频道,工厂等)
这将更容易如果你能理解Netty事件模型以及如何通过管道。这是我对其运作方式的理解。
上游事件(来自网络的事件)从Channel
/ ServerChannel
,Boss / NioWorker开始,然后通过管道发送,直到它到达最后一个处理程序。
下游事件从上一个下游处理程序开始,通过管道发送并在ChannelSink
下沉,通道接收处理事件并采取措施或将消息放在通道的队列中。
更详细地说,(我假设,有人正在寻找Nio TCP传输类来为Netty编写自定义传输)。
<强> NioWorker 强> - 在通道的选择器事件(所有NioClientSocketChannel,NioAcceptedSocketChannel)上运行nio循环 - 从网络收到的数据:收到消防信息 - 轮询写入队列并执行非阻塞写入 - 轮询感兴趣的操作事件的任务队列并暂停/恢复频道?
<强>老板强>
NioAcceptedSocketChannel
,并为NioWorker注册选择器<强> NioClientSocketPipelineSink 强>
<强> NioServerSocketPipelineSink 强>
我的实施应如何回应“InterestOps”类型的东西?
这取决于通道的性质(阻塞/非阻塞)和约束。
ServerChannel.write对于从堆栈中一直到来的消息的调用是什么?这两种不同的重载是什么?
服务器频道不需要支持那些方法调用,我想你指的是频道的
ChannelFuture write(Object message);
ChannelFuture write(Object message, SocketAddress remoteAddress);
这些方法适用于无连接传输。对于TCP,两者实际上都在做同样的事情。
我如何实现ServerChannel。(dis)connect?
服务器渠道不需要支持这些方法调用,但您应该在此处实现bind
和unbind
。
我是否应该通过
ServerBootstrap
完成所有这些工作,或者对于这些内容来说是否太高级了?
服务器/客户端bootstraps只是帮助类来管理管道资源并提供绑定,连接和管理的外观。断开。你必须实现
中的大部分逻辑客户端,服务器通道Impls
客户端,服务器管道下沉
老板,工人阶级,
然后你必须实现客户端&amp;服务器通道工厂使用上面的类,如果这些事情完成,你可以简单地设置你的服务器&amp;客户端使用Bootstrap类。