SwiftNio 简介
用于高性能协议服务器和客户端的事件驱动、无阻塞的网络应用程序框架。
SwiftNIO是一个跨平台异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。
这就像Netty,但是为Swift写的。
Xcode引入swiftNio
在实际写代码前,我们需要把 SwiftNIO 加入我们的项目。我这里都是创建的 Swift Package 项目并通过 SwiftPM 添加依赖的。在 Xcode 的创建项目页面中,选择 Multiplatform 中的 Swift Package。在swiftNio中选择自己需要的库,他的库分别为
swiftNio socket创建
socket 创建跟netty类似,先创建MultiThreadedEventLoopGroup,再创建ClientBootstrap,如果需要域名自解析,新建一个resolver用作自解析。下一章讲述swiftNio 域名自解析,跟netty有点不一样。
/**
创建socket 连接
*/
public func createNormalSocket(host:String,port:Int,ip:String = ""){
// sslContext:NIOSSLContext
self.host = host;
self.IP = ip;
self.port = port;
group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
readHanddle = EchoClientHandler()
readHanddle?.didReadBytes = {[weak self](bytes) in
self?.didReadBytes?(bytes)
}
readHanddle?.statusChange = {[weak self](state, err) in
if(state == self?.status){
//防止重复
return
}
if(state == .none){
self?.status = .none
}else{
self?.status = .connected
}
self?.stopTimer()
DispatchQueue.main.async {
self?.statusChange?(state == .connected,err)
}
}
let bootstrap = ClientBootstrap(group: group!)
.resolver(getResolver(group: group!,host:host,ipAddress:ip))
// Enable SO_REUSEADDR.
.channelOption(ChannelOptions.socketOption(.so_reuseaddr), value: 1)
.channelInitializer {[weak self] channel in
//add context ssl
guard let strongself = self else{
DispatchQueue.main.async {
LogTool.addlog("创建Nio Socket 失败", type: 2,success: 0)
self?.statusChange?(false,nil)
}
return channel.pipeline.addHandler(EchoClientHandler())
}
return channel.pipeline.addHandler(self!.readHanddle!)
}
self.status = .connecting
if ip.count > 0 {
eventLoopfuture = bootstrap.connect(host:ip, port: port)
}else{
eventLoopfuture = bootstrap.connect(host:host, port: port)
}
}