微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift-NIO 数据报的 ChannelInboundHandler 中未调用 channelRead

如何解决Swift-NIO 数据报的 ChannelInboundHandler 中未调用 channelRead

我正在尝试在 Xcode 中运行的(新鲜)蒸气应用程序中捕获 UDP 视频流。数据正在由 ffmpeg 流式传输,我可以使用 VLC 成功查看目标机器上的流,这也是使用 udp://0.0.0.0:5000 运行蒸气应用程序的机器。我使用了各种 Apple 文档来获取下面的代码。当我运行它时,我在控制台日志中得到这些输出行,但我想知道它们是否不相关:

2021-07-07 17:59:27.102681+0100 Run[10550:2494617] [si_destination_compare] send Failed: Invalid argument
2021-07-07 17:59:27.104056+0100 Run[10550:2494617] [si_destination_compare] send Failed: Undefined error: 0

在 configure.swift 中:

try setupClient()

这是客户端代码

final class FrameHandler : ChannelInboundHandler {
    typealias InboundIn = AddressedEnvelope<ByteBuffer>
    typealias OutboundOut = AddressedEnvelope<ByteBuffer>

    func channelRead(ctx: ChannelHandlerContext,data: NIOAny) {
        // minimal for question
    }
    
    func errorCaught(ctx: ChannelHandlerContext,error: Error) {
        // minimal for question
    }
}

func setupClient() throws {
    let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
    let bootstrap = DatagramBootstrap(group: group)
        .channelOption(ChannelOptions.socketoption(.so_reuseaddr),value: 1)
        .channelInitializer { channel in
            channel.pipeline.addHandler(FrameHandler())
    }
    defer {
        try! group.syncShutdownGracefully()
    }

    let channel = try bootstrap.bind(host: "0.0.0.0",port: 5000).wait()
    try channel.closeFuture.wait()
}

问题是,虽然 channelRegisteredchannelActive调用,然后是一个永无止境的 readComplete 流,但重要的 channelRead 永远不会被调用 - 也没有errorCaught。如果我注释掉对 setupClient 的调用,则没有网络活动,但是,如果它运行,则 Xcode 的网络监视器显示的活动与 ffmpeg 中的级别一致。所以,我相信正在建立连接。

我想知道问题是否出在我设置处理程序的方式上?所有示例都使用回显或反射聊天示例,因此使用上下文在数据写入函数的闭包中设置入站处理程序,而不是将其添加到初始化程序中(尽管出站处理程序以这种方式设置)。

解决方法

我假设您使用的是基于 SwiftNIO 2 的 Vapor 4。在 NIO 2 中,ChannelHandlerContext 变量被称为 context 而不是 ctx。因此,如果您只是将所有 ctx 重命名为 context,我认为它会起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?