Я пытаюсь использовать новую Network.framework для подключения к WebSocket, но получаю ответ ноль-рукопожатие с сервера.
(Да, я знаю, что Starscream существует, но он не поддерживает прокси / мобильность переключения пользователей междусетевой интерфейс)
Мой тестовый код:
func beginTest() {
let connection = NWConnection(host: "echo.websocket.org", port: 443, using: .tls)
connection.stateUpdateHandler = { state in
print("State:", state)
switch state {
case .ready:
self.connectionReady(connection)
default:
break
}
}
connection.start(queue: .main)
}
func connectionReady(_ connection: NWConnection) {
let raw = """
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: echo.websocket.org
Origin: https://echo.websocket.org
Sec-WebSocket-Key: s04nPqA7M6pQ3Lu2jRJLSQ==
Sec-WebSocket-Version: 13
"""
let rawData = raw.appending("\n\n\n").replacingOccurrences(of: "\n", with: "\r\n").data(using: .utf8)
connection.send(content: rawData!, completion: .idempotent)
connection.receiveMessage(completion: {data, context, bool, error in
if let data = data {
print("Received:", String(data: data, encoding: .utf8))
}
print("Error:", error)
let hello = "Hello".data(using: .utf8)
connection.send(content: hello, completion: .idempotent)
})
}
Это нулевой ответ и соединение разорвано вместо получения ответа Обновление рукопожатия от сервера, ниже с журналами консоли:
State: preparing
State: ready
Received: nil
Error: nil
2018-10-08 11:38:57.314885+0800 SwiftNetworkTest[86448:3026660] [] nw_socket_handle_socket_event [C1.1:2] Socket SO_ERROR [54: Connection reset by peer]
Кто-нибудь может подсказать мне, как использовать Apple новую Network.framework?Это будет высоко ценится!
Обновление1
Плохо, теперь я могу видеть ответ рукопожатия с использованием кодировки .ascii
вместо .utf8
.
Но у меня все еще прерывается соединение Connection reset by peer
.Как сохранить соединение после обновления до WebSocket?