HJWebsocketDogma
基于 HJAsyncTcpCommunicator 的 WebSocket 客户端/服务器库。
安装
您可以从我们的发行页面下载最新的框架文件。HJWebsocketDogma 也通过 CocoaPods 提供使用。要安装它,只需将以下行添加到您的 Podfile。
pod 'Hydra', :modular_headers => true
pod 'HJAsyncTcpCommunicator', :modular_headers => true
pod 'HJWebsocketDogma'
设置
HJWebsocketDogma 是基于 HJAsyncTcpCommunicator 的库,HJAsyncTcpCommunicator 是基于 Hydra 的框架。将工作者添加到 Hydra,绑定 HJAsyncTcpCommunicator 并启动。
Hydra.default().addCommonWorker()
HJAsyncTcpCommunicateManager.default().standby(withWorkerName: HydraCommonWorkerName)
HJAsyncTcpCommunicateManager.default().bind(toHydra: Hydra.default())
Hydra.default().startAllWorkers()
声明 HJWebsocketDogma。
let wsdogma = HJWebsocketDogma(limitFrameSize: 8180, limitMessageSize: 1024*1024*10)
使用您处理的关键字注册服务器信息。例如,对于 "https://:8080/ws",
let serverKey = "MyServerKey"
let parameters:[AnyHashable:Any] = [HJWebsocketDogma.parameterOriginKey:"https://:8080/ws, HJWebsocketDogma.parameterEndpointKey:"ws"];
let serverInfo = HJAsyncTcpServerInfo.init(address: "localhost", port: 8080, parameters: parameters)
HJAsyncTcpCommunicateManager.default().setServerInfo(serverInfo, forServerKey: serverKey)
播放
通过客户端使用 WebSocket,使用 HJWebsocketDogma 调用 HJAsyncTcpCommunicateManager 接口,按照您的方式编写业务代码。
HJAsyncTcpCommunicateManager.default().connect(serverKey, timeout: 3.0, dogma: wsdogma, connect: { (flag, key, header, body) in
if flag == true { // connect ok
print("- client \(key) connected.")
} else { // connect failed
print("- connect failed.")
}
}, receive: { (flag, key, header, body) in
if flag == true { // receive ok
print("- client \(key) received.")
if let dataFrame = headerObject as? HJWebsocketDataFrame {
if let text = dataFrame.data as? String {
print("- got text")
} else if let data = dataFrame.data as? Data {
print("- got binary")
}
}
}
}, disconnect: { (flag, key, header, body) in
if flag == true {
let closeReason = ((header as? HJWebsocketDataFrame)?.data as? String) ?? "done"
print("- client \(key) disconnected, \(closeReason").")
}
})
连接后,您可以在连接处理程序或通知处理程序中获取客户端关键字。您可以通过该客户端关键字相互发送数据。
发送文本如下,
let headerObject = HJWebsocketDogma.textFrame(text: "hello", supportMode: .client)
HJAsyncTcpCommunicateManager.default().sendHeaderObject(headerObject, bodyObject: nil, toClientKey: clientKey) { (flag, key, header, body) in
if flag == false { // send failed
print("- client \(key) send failed.")
} else {
print("- client \(key) sent.")
}
}
发送二进制如下,
let headerObject = HJWebsocketDogma.binaryFrame(data: Data("hello".utf8), supportMode: .client)
HJAsyncTcpCommunicateManager.default().sendHeaderObject(headerObject, bodyObject: nil, toClientKey: serverKey) { (flag, key, header, body) in
if flag == false { // send failed
print("- client \(key) send failed.")
} else {
print("- client \(key) sent.")
}
}
使用服务器端WebSocket,通过HJWebsocketDogma调用HJAsyncTcpCommunicateManager接口,并按照自己的方式编写业务代码。
let serverInfo = HJAsyncTcpServerInfo.init(address: "localhost", port: 8080)
HJAsyncTcpCommunicateManager.default().setServerInfo(serverInfo, forServerKey: serverKey)
HJAsyncTcpCommunicateManager.default().bind(serverKey, backlog: 4, dogma: wsdogma, bind: { (flag, key, header, body) in
if flag == true { // bind ok
print("- server \(key) bind ok.")
} else { // bind failed
print("- server \(key) bind failed.")
}
}, accept: { (flag, key, header, body) in
if flag == true {
print("- client \(key) accepted" );
}
}, receive: { (flag, key, header, body) in
if flag == true, let clientKey = key, let dataFrame = header as? HJWebsocketDataFrame { // receive ok
if let receivedText = dataFrame.data as? String {
print("- client \(key) receive text: \(receivedText)")
} else if let receivedData = dataFrame.data as? Data {
print("- client \(key) receive binary")
}
}
}, disconnect: { (flag, key, header, body) in
if flag == true {
print("- client \(key) disconnected.")
}
}, shutdown: { (flag, key, header, body) in
if flag == true { // shutdown ok
print("- server \(key) shutdowned.")
}
})
来自服务器的数据发送与客户端相同。唯一不同的是将supportMode设置为.server,如上所述。您可以在accept处理程序或通知处理程序中获取客户端键。
let headerObject = HJWebsocketDogma.textFrame(text: "hello", supportMode: .server)
let headerObject = HJWebsocketDogma.binaryFrame(data: Data("hello".utf8), supportMode: .server)
您还可以将数据广播到所有已连接的客户端。
let headerObject = HJWebsocketDogma.textFrame(text: "hello", supportMode: .server)
HJAsyncTcpCommunicateManager.default().broadcastHeaderObject(headerObject, bodyObject: nil, toServerKey: serverKey)
您还可以观察HJWebsocketDogma事件来处理业务逻辑。
NotificationCenter.default.addObserver(self, selector: #selector(self.tcpCommunicateManagerHandler(notification:)), name: NSNotification.Name(rawValue: HJAsyncTcpCommunicateManagerNotification), object: nil)
@objc func tcpCommunicateManagerHandler(notification:Notification) {
guard let userInfo = notification.userInfo,
let serverKey = userInfo[HJAsyncTcpCommunicateManagerParameterKeyServerKey] as? String,
let eventValue = userInfo[HJAsyncTcpCommunicateManagerParameterKeyEvent] as? Int,
let event = HJAsyncTcpCommunicateManagerEvent(rawValue: eventValue) else {
return
}
let clientKey = userInfo[HJAsyncTcpCommunicateManagerParameterKeyClientKey] as? String ?? "--"
switch event {
case .connected:
print("- server \(serverKey) client \(clientKey) connected.")
case .disconnected:
print("- server \(serverKey) client \(clientKey) disconnected.")
case .sent:
print("- server \(serverKey) client \(clientKey) sent.")
case .sendFailed:
print("- server \(serverKey) client \(clientKey) send failed.")
case .received:
print("- server \(serverKey) client \(clientKey) received.")
case .binded:
print("- server \(serverKey) binded.")
case .accepted:
print("- server \(serverKey) client \(clientKey) accepted.")
case .shutdowned:
print("- server \(serverKey) shutdowned.")
default:
break
}
}
许可协议
MIT许可协议,适用于所有情况。 http://en.wikipedia.org/wiki/MIT_License