0

我正在使用 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 的协议是否正常,或者标头中是否缺少任何信息?

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

4

1 回答 1

1

您缺少Sec-WebSocket-Key和标头,这是WebSocket 协议握手Sec-WebSocket-Version的关键部分。

这是实际握手的样子:

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
于 2014-04-14T13:19:36.770 回答