【问题标题】:Server not sending HTTP 101 response when creating a websocket using CC3000 and socket.io使用 CC3000 和 socket.io 创建 websocket 时服务器未发送 HTTP 101 响应
【发布时间】:2014-05-28 06:00:27
【问题描述】:

我正在使用 socket.io 将 CC3000 连接到 node.js 服务器。我使用以下库创建了一个 websocket https://github.com/chadstachowicz/socket_io_arduino_cc3000

在 SocketIOClient.cpp 中,它创建一个 TCP 连接,获取一个 session-id(sid)。它断开并创建另一个 TCP 连接,并使用 sid 将连接升级到 websocket。为此,客户端(此处为 CC3000)发送以下标头信息:

client.print(F("GET /socket.io/1/websocket/"));
client.print(sid);
client.println(F(" HTTP/1.1"));
client.print(F("Host: "));
client.println(hostname);
client.println(F("Origin: ArduinoSocketIOClient"));
client.println(F("Upgrade: WebSocket"));    // must be camelcase ?!
client.println(F("Connection: Upgrade\r\n"));

在此请求之后,客户端等待来自服务器的 HTTP 101 响应。但是服务器没有发送任何响应。它记录为警告“websocket 连接无效”并结束连接。

创建 websocket 的协议是否正常,或者 header 中是否缺少任何信息?

另外,我想知道 'Origin' 的值应该是多少?第一次握手时是“Arduino”,而第二次握手时是“ArduinoSocketIOClient”。

【问题讨论】:

    标签: websocket socket.io arduino websocket++


    【解决方案1】:

    您缺少Sec-WebSocket-KeySec-WebSocket-Version 标头,这是WebSocket protocol handshake 的关键部分。

    这是实际握手的样子:

    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13
    Origin: http://example.com
    

    【讨论】:

    • 我使用的库声明“该库不支持 Websocket 规范的每一寸,尤其是使用 Sec-Websocket-Key。”即使我尝试使用 Sec-Wesocket-Key 但它没有效果。
    • 如果没有该标头,您将无法建立 websocket 连接。来源可以是任何东西,取决于服务器是否接受该来源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    相关资源
    最近更新 更多