【问题标题】:SwiftNIO: connect is not working if the code is in a classSwiftNIO:如果代码在一个类中,则连接不起作用
【发布时间】:2020-02-01 15:12:15
【问题描述】:

我刚开始使用 SwiftNIO,第一次尝试使用此代码:

let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let bootstrap = ClientBootstrap(group: group)
    // Enable SO_REUSEADDR.
    .channelOption(ChannelOptions.socket(SocketOptionLevel(SOL_SOCKET), SO_REUSEADDR), value: 1)
defer {
    try? group.syncShutdownGracefully()
}

do {
    let channel = try bootstrap.connect(host: "127.0.0.1", port: 1234).wait()
    try channel.closeFuture.wait()
} catch let error {
    print(error)
}

它可以工作,但我打印了一个错误,因为我的服务器没有运行。

但是,如果我将该代码带到课程中,则什么也不会发生:

class Client {

    let bootstrap: ClientBootstrap

    init() {
        let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
        self.bootstrap = ClientBootstrap(group: group)
            // Enable SO_REUSEADDR.
            .channelOption(ChannelOptions.socket(SocketOptionLevel(SOL_SOCKET), SO_REUSEADDR), value: 1)
        defer {
            try? group.syncShutdownGracefully()
        }
    }

    func connect(host: String, port: Int) throws {
        let channel = try self.bootstrap.connect(host: host, port: port).wait()
        try channel.closeFuture.wait()
    }
}

let client = Client()
do {
    try client.connect(host: "127.0.0.1", port: 1234)
} catch let error {
    print(error)
}

我做错了什么?

【问题讨论】:

    标签: swift swift-nio


    【解决方案1】:

    原始代码在什么上下文中运行?在 init 方法中看到 defer 是不寻常的,尤其是在结尾处 - 它会在 init 完成后立即执行,而原始代码中的 defer 将在 do 之后执行 /catch 块被执行。

    您可能希望关闭代码位于 Client 类的 deinit 方法中。

    【讨论】:

    • 我自己发现的。抱歉这个愚蠢的问题,你完全正确!
    • 我强烈建议不要使用deinit 来关闭 MultiThreadedEventLoop 组。如果 deinit 从您尝试关闭的 EventLoop 运行(并且您无法控制运行 deinit 的线程),这可能会导致死锁或崩溃。通常,一个进程应该有一个 EventLoopGroup。我建议将 EventLoopGroup 传递给 init 而不是在那里创建它。 main.swift 是创建 EventLoopGroup 的好地方。
    • @JohannesWeiss 我相信你是对的 :) 。我对 SwiftNIO 一无所知,我只是在评论问题中的代码。谢谢你的澄清
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2019-11-24
    相关资源
    最近更新 更多