URLSessionWebSocketTask - 使用客户端 pong 对来自服务器的 ping 进行响应

Lor*_*bis 6 ping websocket swift

我使用Apple提供的URLSessionWebSocketTask来设置websocket。我接收、发送消息并且可以发送 ping。但是我应该如何接收和响应来自 ws 服务器的 ping?我必须使用向客户端发送 ping 的服务器来检查它们是否仍然存在。
如果我从服务器收到某些信息,我如何识别来自该服务器的 ping?收到的消息中是否有一些密钥代码?

func receive() {
    webSocketTask.receive { result in
        print(result)
        switch result {
        case .failure(let error):
                print("Failed to receive message: \(error)")
                ....
        case .success(let message):
            switch message {
            case .data(let data):
                print("\(data)")
                ....
            case .string(let text):
                print("\(text)")
                .....

            @unknown default:
                fatalError()
            }
        }
        receive()
    }
}
Run Code Online (Sandbox Code Playgroud)

上面当然是一段常见的代码,但是我应该实现什么来响应来自连接服务器的 ping ?我确实阅读了几个文档,但找不到任何内容、任何指示或建议。

我确实找到了以下 OpCode0x90xA. 那些是“乒”和“乒”吗?我可以发送 a 0x9as ping 和 for pong a吗0xA?如果我尝试将此作为短信,但没有得到任何反应。应该是一个框架吗?那么我到底做错了什么?

use*_*608 2

这需要一些挖掘,但您必须.pongNWProtocolWebSocket.Metadata对象中设置操作码,然后将其输入到函数context中的参数中NWconnection.send。您的数据应反映 ping 中发送的内容。

  let metadata = NWProtocolWebSocket.Metadata(opcode: .pong)
  let context = NWConnection.ContentContext(identifier: "context", metadata: [metadata])
    
  client.send(content: data, contentContext: context, isComplete: true, completion: .contentProcessed({ error in
        if let error = error {
            print(error.localizedDescription)
        } else {
            // no-op
        }
    }))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,客户是你的NWConnection