SwiftNIO:如果代码在 class 中,则连接不起作用
SwiftNIO: connect is not working if the code is in a class
我刚开始使用 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,什么也不会发生:
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)
}
我做错了什么?
原始代码在什么上下文中 运行?在 init 方法中看到 defer
是不寻常的,尤其是在最后 - 它会在 init 完成后立即执行,而原始代码中的 defer 将在 after 执行 do / catch 块。
您可能希望关闭代码位于 Client
class 的 deinit
方法中。
我刚开始使用 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,什么也不会发生:
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)
}
我做错了什么?
原始代码在什么上下文中 运行?在 init 方法中看到 defer
是不寻常的,尤其是在最后 - 它会在 init 完成后立即执行,而原始代码中的 defer 将在 after 执行 do / catch 块。
您可能希望关闭代码位于 Client
class 的 deinit
方法中。