В ответе рукопожатия WebSocket отсутствует строка состояния HTTP - PullRequest
0 голосов
/ 17 марта 2020

Из-за интереса к этой теме я решил иметь go для создания клиентской библиотеки WebSocket для Kotlin с использованием TCP.

Итак, я читаю RFC6455, и в нем упоминается что при квитировании ответ сервера должен иметь строку состояния HTTP. Круто, я делаю запрос:

GET / HTTP/1.1
Host: echo.websocket.org:80
Upgrade: websocket
Connection: Upgrade
Accept: */*
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: Dg8CY18ZTGbAkIzNhpO3mA==

, и сервер отвечает с

Connection: Upgrade
Sec-WebSocket-Accept: akyZ/0pr8WyuXVfejRWVAUGSW3k=
Upgrade: websocket

Как видите, строка состояния HTTP отсутствует. Я что-то упустил в RFC6455, мой код глуп?

код (PayloadFactory.kt):

fun createSecWebSocketKey(): String? {
    val bytes = ByteArray(16)
    SecureRandom.getInstanceStrong().nextBytes(bytes)
    return String(Base64.getEncoder().encode(bytes)!!)
}

fun createOpeningHandshake(host: String, path: String = "/", port: Int = 80, protocolVersion: Int = 13): String
{
    // I'm aware path isn't used yet, that's something I plan to implement but haven't yet.
    var handshake = ""
    handshake += "GET / HTTP/1.1\r\n"
    handshake += "Host: $host:$port\r\n"
    handshake += "Upgrade: websocket\r\n"
    handshake += "Connection: Upgrade\r\n"
    handshake += "Accept: */*\r\n"
    handshake += "Sec-WebSocket-Version: $protocolVersion\r\n"
    handshake += "Sec-WebSocket-Key: ${createSecWebSocketKey()}\r\n\r\n"
    return handshake
}

код (WebSocket.kt):

class WebSocket(protocol: String, host: String, port: Int = 80, protocolVersion: Int = 13) {
    private val client: Socket = Socket(host, port)
    private val globallyUniqueIdentifier = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

    init {
        val handshake = createOpeningHandshake(host, protocolVersion = protocolVersion)
        println("============CLIENT HANDSHAKE============")
        println(handshake)
        client.getOutputStream().write(handshake.toByteArray())
        println("============SERVER RESPONSE=============")
        val input = BufferedReader(InputStreamReader(client.getInputStream()))
        while (true)
        {
            if (input.readLine() != null) {
                val line = input.readLine()
                println(line)
            }
        }
    }
}

запустить: WebSocket("ws", "echo.websocket.org", 80)

1 Ответ

0 голосов
/ 17 марта 2020

РЕШЕНО

Я не сохранял результат readLine () в переменной, из-за чего я фактически отбрасывал каждую нечетную строку в ответе. Спасибо user207421 за указание на это!

...