【问题标题】:Custom Netty ServerChannel implementation自定义 Netty ServerChannel 实现
【发布时间】:2012-02-18 00:03:19
【问题描述】:

我想要集成两个系统,一个使用完全内部的网络堆栈,另一个(特别是 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 的网络堆栈替换我们的自定义网络堆栈,但这是一项大型工程任务,我很难证明其合理性。婴儿步。

【问题讨论】:

    标签: netty


    【解决方案1】:

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

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

    如果您能够理解 Netty 事件模型以及如何通过管道,那将会更容易。这是我对其工作原理的理解。

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

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

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

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

    老板

    • 运行服务器 NIO 事件循环。
    • 接受客户端socket,创建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 来做所有这些事情,还是这对这些事情来说太高级了?

    服务器/客户端引导程序只是管理管道资源并提供绑定、连接和断开连接的外观的辅助类。您必须在

    中实现大部分逻辑

    客户端、服务器通道实现
    客户端、服务器管道接收器
    老板,工人阶级,

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

    【讨论】:

    • 我假设这与netty 3.x.x有关,当涉及到传输实现时,netty 4.x.x的代码将完全改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2014-10-14
    • 2011-06-04
    • 2010-10-29
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多