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

Python websocket服务器-发送消息

龙毅
2023-03-14

我正在编写自己的websocket服务器和客户端。我成功地处理了握手并建立了联系。

现在我正在编写send_message函数,它创建了一个合适的框架。下面的例子只是为了这个问题,它不是我最终打算写的,这只是我尝试给我相同的结果的许多方法中的一种。

def send_message(client_socket: socket.socket, message: str):
    length = len(message)
    opcode = 0x1
    fin, rsv1, rsv2, rsv3, opcode = 1, 0, 0, 0, opcode
    first_byte = chr(fin << 7 | rsv1 << 6 | rsv2 << 5 | rsv3 << 4 | opcode)
    if length < 126:
        mask = 0
        second_byte = chr(mask << 7 | length)
        first_byte += second_byte
        first_byte = six.b(first_byte)
    payload = first_byte + message.encode("utf-8")

    return client_socket.send(payload)

输入:Ok from server以上函数应发送b'\x81\x0eOk from server'

第一个字节\x81-10000001

第一位设置为1-FIN,表示这是消息的最后一帧

第二、第三和第四个-所有的零,对于这个例子来说是不相关的

以下四位-opcode0001,表示消息为文本

有问题的第二个字节\x0e应该是00001110第一位设置为0-mask,如果设置为1,则有效负载被屏蔽,在我的情况下必须设置为0,从服务器到客户端的所有消息都不能被屏蔽

以下7位-有效负载长度,如果来自服务器的Ok=14

剩下的是有效载荷。

现在,当我在chrome中将此消息发送到javascript客户端时,我收到:WebSocket到“ws://localhost:8002/”的连接失败:服务器不能屏蔽它发送给客户端的任何帧

我从多个示例中复制了代码(webSocket,SimpleWebSocketServer等)。)都给了我相同的b'\x81\x0eOk from server'

问题1我做错了什么?

问题#2我如何调试网络套接字?在chrome开发工具中,不再有用于检查网络套接字的“框架”选项卡,所以看不到收到的实际字节。尝试了Wireshark,但明显解码webSocket帧功能已经丢失多年。

编辑

该函数创建正确的有效负载,问题出在其他地方,可能是套接字设置。


共有1个答案

甘祺
2023-03-14

最初的握手是\n\r而不是\r\n。所有客户端都建立了连接,但在解析下面的消息时,它们会收到一个额外的字节,从而创建导致错误的倾斜帧。

 类似资料:
  • 每次机器人被邀请到服务器时,我都想发送一条消息。然后它应该写这样的话:“你好,这是我的不和机器人” 到目前为止,我有这个代码,它不会产生错误,但也不会发送消息。

  • 我目前正在制作一个discord bot,并希望在服务器加入时在服务器的通道中发送一条消息,这是我到目前为止的代码。 当我运行这段代码时,什么都不会发生。我没有得到任何ERORR或输出。 如果有人能帮忙,那就太棒了。谢谢

  • 我有一个简单的netty连接池和一个简单的HTTPendpoint来使用该池向ServerSocket发送TCP消息。相关代码看起来是这样的,客户端(NettyConnectionPoolClientApplication)是: 和服务器(ServerSocketRunner) 虚拟通道池处理程序和虚拟客户端处理程序只是打印出发生的事件,因此它们不相关。当服务器和客户端启动并且我向测试endpoi

  • 我有一个BE服务a,它正在使用假客户端向microservice B发送Rest JSON消息: 终点: Rest Endpoint正在向AWS Ses邮件或其他邮件提供商发送邮件。 问题是来自飞格的第一个呼叫可能需要5秒或更长时间。我需要使其异步,以便FE客户端不要等待邮件发送。 我如何可以使从飞度异步发出的Rest调用到超文本传输协议响应OK没有等待时间可以预期?是否有一些更好的解决方案来实现

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“