我正在从服务器发送自定义web套接字帧到客户端。我成功地实现了无缝握手,但发送常规文本帧会导致我出现问题(客户端未接收到消息)。这是我发送的内容:
unsigned char data2[6] = { 129, 4, 't', 'e', 'x', 't' };
int jj = SDLNet_TCP_Send(client_socket, data2, 6);
数据被正确发送(握手工作和jj的值为6)。我基于我的代码在这里找到的解释,我如何在服务器端发送和接收WebSocket消息?
我的客户端很简单,我发布只是为了完成:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Web Socket Example</title>
<meta charset="UTF-8">
<script type="text/javascript">
var webSocket = new WebSocket("ws://localhost:48884/", "sample");
webSocket.binaryType = "arraybuffer";
webSocket.onopen = function(e) { alert("opened"); }
webSocket.onclose = function(e) { alert("closed"); }
webSocket.onerror = function(e) { alert("error"); }
webSocket.onmessage = function(e) { alert("got: " + e.data); }
</script>
</head>
<body>
<div id="holder" style="width:600px; height:300px"></div>
</body>
</html>
我从客户端得到的web套接字版本是13.
你知道为什么握手有效而普通文本无效吗?
我解决了这个问题。它现在可以工作了,因为事实证明,在握手结束时需要额外的rn (https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers)。所以我的握手是不正确的,但不知何故火狐接受了它(但后来不接受消息)。
总之,我上面发布的链接说握手的格式应该是:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: key
empty line
我遵守了这个格式,然后它在Firefox和IE上都工作得很好,但在Chrome上却没有。我发现,要使它在Chrome上工作,我还需要指定协议:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: key
Sec-WebSocket-Protocol: my_protocol_name
empty line
上面的握手格式使我的握手和服务器到浏览器的消息发送工作在Firefox, IE和Chrome