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 服务器:向客户端发送文本帧的主要内容,如果未能解决你的问题,请参考以下文章

Websocket阻止来自服务器的传入请求

php使用WebSocket详细教程之对接收数据解包及发送数据包装

c++ websocket帧发送导致服务器关闭连接

WebSocket - 关闭框架

socket.io websocket

如何在 Go 中创建 WebSocket 应用程序