我有两个我想要集成的系统,一个使用完全内部网络堆栈,另一个(特别是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事件的轮询任务队列并暂停/恢复这个频道?.
老板
NioAcceptedSocketChannel
为NioWorker 创建和注册选择器 NioClientSocketPipelineSink
NioServerSocketPipelineSink
我的实现应如何回应"InterestOps"类型的东西?
它取决于通道的性质(阻塞/非阻塞)和约束.
ServerChannel.write是什么叫做一直到堆栈的消息?这两种不同的重载是什么?
服务器通道不需要支持那些方法调用,我想你指的是Channel的
ChannelFuture write(Object message);
ChannelFuture write(Object message, SocketAddress remoteAddress);
Run Code Online (Sandbox Code Playgroud)
这些方法用于无连接传输.对于TCP,两者实际上都在做同样的事情.
我如何实现ServerChannel.(dis)connect?
服务器通道并不需要支持这些方法调用,但你应该执行,bind
并unbind
在这里.
我是否仍然应该完成所有这些工作
ServerBootstrap
,或者对于这些东西来说太高级了?
服务器/客户端引导只是帮助类来管理管道资源并提供绑定,连接和断开的外观.你必须实现大部分逻辑
客户端,服务器通道Impls
客户端,服务器管道下沉
老板,工人类,
然后你必须使用上面的类来实现客户端和服务器通道工厂,如果完成这些工作,你可以使用Bootstrap类简单地设置服务器和客户端.