HJWebsocketDogma 2.0.1

HJWebsocketDogma 2.0.1

Tae Hyun Na维护。



  • 作者
  • Tae Hyun Na

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