Swift-NIO 数据报的 ChannelInboundHandler 中未调用 channelRead
channelRead not being called in Swift-NIO Datagram's ChannelInboundHandler
我正在尝试在 Xcode 中 运行ning 的(新鲜)vapor 应用程序中捕获 UDP 视频流。数据正在通过 ffmpeg 流式传输,我可以使用 VLC 在目标机器上成功查看流,这也是使用 运行ning vapor 应用程序,使用 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()
}
问题是尽管 channelRegistered
和 channelActive
被调用,紧接着是永无止境的 readComplete
流,但重要的 channelRead
永远不会被调用 - errorCaught
也没有。如果我注释掉对 setupClient 的调用,则没有网络 activity,但是,如果它 运行s 那么 Xcode 的网络监视器显示 activity 与中的级别一致ffmpeg。所以,我相信正在建立连接。
我想知道问题是否出在我设置处理程序的方式上?所有示例都使用 echo 或反射聊天示例,因此入站处理程序是在使用上下文的数据写入函数的闭包中设置的,而不是将其添加到初始化程序中(尽管出站处理程序是以这种方式设置的)。
我假设您使用的是基于 SwiftNIO 2 的 Vapor 4。在 NIO 2 中,ChannelHandlerContext
变量被称为 context
而不是 ctx
。因此,如果您将所有 ctx
重命名为 context
,我认为它会起作用。
我正在尝试在 Xcode 中 运行ning 的(新鲜)vapor 应用程序中捕获 UDP 视频流。数据正在通过 ffmpeg 流式传输,我可以使用 VLC 在目标机器上成功查看流,这也是使用 运行ning vapor 应用程序,使用 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()
}
问题是尽管 channelRegistered
和 channelActive
被调用,紧接着是永无止境的 readComplete
流,但重要的 channelRead
永远不会被调用 - errorCaught
也没有。如果我注释掉对 setupClient 的调用,则没有网络 activity,但是,如果它 运行s 那么 Xcode 的网络监视器显示 activity 与中的级别一致ffmpeg。所以,我相信正在建立连接。
我想知道问题是否出在我设置处理程序的方式上?所有示例都使用 echo 或反射聊天示例,因此入站处理程序是在使用上下文的数据写入函数的闭包中设置的,而不是将其添加到初始化程序中(尽管出站处理程序是以这种方式设置的)。
我假设您使用的是基于 SwiftNIO 2 的 Vapor 4。在 NIO 2 中,ChannelHandlerContext
变量被称为 context
而不是 ctx
。因此,如果您将所有 ctx
重命名为 context
,我认为它会起作用。