Свифт Network.framework WebSocket рукопожатие ноль вернулся - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь использовать новую 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?

1 Ответ

0 голосов
/ 05 ноября 2018

Вы должны следовать рекомендациям Websocket, как форматировать отправленное Websocket сообщение.

Я думаю, что это хороший ресурс.Я использовал это сам.

https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers

...