WebSocket 服务器:向客户端发送文本帧
Posted
技术标签:
【中文标题】WebSocket 服务器:向客户端发送文本帧【英文标题】:WebSocket server: sending text frames to client 【发布时间】:2016-11-08 23:14:36 【问题描述】:我正在从服务器向客户端发送自定义 Web 套接字帧。我设法无缝地握手,但发送常规文本帧会给我带来问题(未收到客户端的消息)。这是我发送的:
unsigned char data2[6] = 129, 4, 't', 'e', 'x', 't' ;
int jj = SDLNet_TCP_Send(client_socket, data2, 6);
数据发送正确(握手成功,jj 的值为 6)。我的代码基于此处How can I send and receive WebSocket messages on the server side? 的解释。
我的客户很简单,我发帖只是为了完成:
<!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 socket 版本是 13。
任何想法为什么握手有效而常规文本无效?
【问题讨论】:
您在服务器上使用什么语言,您希望得到什么语言的答案?你怎么知道握手有效?到目前为止,您尝试了什么? 我希望握手工作,因为当我运行客户端时,我得到了警报(“打开”)。我使用 C++,但这无关紧要。 后续行动。我刚刚在 Internet Explorer(以前使用过 Firefox)上检查了这个。在 IE 上我打开了,但随后立即出错(未定义)并关闭。 【参考方案1】:我解决了这个问题。它现在可以工作,因为事实证明在握手结束时需要额外的 \r\n (https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers)。所以我的握手不正确,但 Firefox 以某种方式接受了它(但后来不接受消息)。
无论如何,我上面发布的链接说握手格式应该是:
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 上进行握手和服务器到浏览器的消息发送
【讨论】:
以上是关于WebSocket 服务器:向客户端发送文本帧的主要内容,如果未能解决你的问题,请参考以下文章