当前位置: 首页 > 知识库问答 >
问题:

WebSocket服务器:向客户端发送文本帧

邓鸿信
2023-03-14

我正在从服务器向客户端发送自定义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。

知道为什么握手有效而普通文本无效吗?

共有1个答案

严宇
2023-03-14

我解决了这个问题。它现在起作用了,因为事实证明在握手(https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers)结束时需要额外的\r\n。所以我的握手是不正确的,但不知何故火狐接受了它(但后来不接受消息)。

无论如何,我在上面贴的链接说握手的格式应该是:

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上进行握手和服务器到浏览器的消息发送

 类似资料:
  • 问题内容: 所以现在,我正在制作一个基于客户端服务器应用程序的多线程。在服务器端,我为接受的每个连接创建了一个线程。 在线程类中,我创建了一种将命令发送到客户端的方法。我只想要的是如何将参数发送到所有正在运行的客户端?为简单起见,我只想使此服务器向所有连接的客户端发送消息。 我已经阅读了这篇文章,并从此链接中找到方法。但是,当我尝试使用自己的代码时,中没有类似的方法。 好的,这是我的服务器和线程示

  • 问题内容: 我是golang和websocket的新手。 我正在尝试编写一个websocket服务器,一旦握手完成,该服务器可以将消息主动发送到客户端。 但是我的服务器只会在收到来自客户端的请求后才将消息发送给客户端。 有谁知道如何实现此功能,或者在哪里可以找到相关的答案? 非常感谢。 源代码如下: 问题答案: 尝试打包websocket。 这是Godoc的一个简单示例:

  • 问题内容: 我正在尝试在Java中的服务器和JavaScript客户端之间建立连接,但在客户端出现此错误: WebSocket与“ ws://127.0.0.1:4444 /”的连接失败:在收到握手响应之前,连接已关闭 由于可能从未调用该函数,因此它可能保持在OPENNING状态。该不会被调用。 有人可以让我知道这里出了什么问题吗? 服务器 服务器线程 游戏协议 客户 问题答案: 首先,您的两个代

  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

  • 问题内容: 我将实现类似于Facebook通知和此网站的内容(StackOverflow的通知会通知我们是否有人为我们的问题写评论/答案等)。请注意,用户将使用我的应用程序作为网站而不是移动应用程序。 我遇到以下获取结果的答案,但我需要推送结果而不是获取结果。 根据建议,我在实体类中创建了一个简单方法,并向其中添加了@PostPersist,但此方法不起作用,因此基于此答案,我添加了persist

  • 当我提交表单时,我在浏览器控制台中看到“emit”消息,所以我知道表单提交事件正在触发,但我没有在服务器上收到测试消息。客户端或服务器端似乎什么也没发生,“socket.emit”函数似乎什么也没做。 我做错了什么?