【问题标题】:Do websockets send and receive full messages?websockets 是否发送和接收完整的消息?
【发布时间】:2019-11-16 18:28:34
【问题描述】:

我是 Web 开发的新手,我正在尝试使用 python 和 django 为我的服务器编写一个简单的 Web 游戏,并为前端图形使用一些 javascript。我正在使用channels 包来使用 websockets 进行通信,我对 websockets 有一点疑问。

在 python 中,我知道当我们使用套接字时,不能保证消息被完全发送。例如,如果我在 python 中使用socket.send,我可能不会发送整个消息,在这种情况下我需要重新发送剩下的内容,而在接收端,我不能保证使用socket.recv 获得完整的消息(假设bufsize 参数对于完整的消息足够大),所以我必须继续调用recv,直到我收到整个消息。

我的问题是:websockets 是否一样?

我尝试在MDN 文档和谷歌中查找此内容,但找不到任何相关信息。此外,我在网上看到的每个示例都没有考虑到这一点,所以看起来我用socket.send(在javascript中)发送的内容正是我在另一端得到的,反之亦然。

这是真的吗?我可以假设我在客户端使用socket.send 发送的消息将在服务器端的一个事件中完全接收(在我的情况下是websocket consumer),反之亦然:如果服务器发送消息到客户端,它会在客户端的一个Message事件中被完全接收到吗?

提前致谢。

【问题讨论】:

  • Websocket 是在套接字之上的一个抽象级别,就像 HTTP 一样。他们应该已经负责发送块,直到发送完整的消息,以及在接收端。就像您在使用常规 HTTP 客户端或服务器时不必担心这一点一样,您也不应该担心这一点,因为底层的 websocket 客户端应该这样做

标签: javascript python django websocket django-channels


【解决方案1】:

您可以假设如果客户端已连接,则会收到该消息。反之亦然,服务器将收到它正在收听的消息。

Django 频道确实不可靠。

Calling receive on these channels does not guarantee that you will get the messages in order or that you will get anything if the channel is non-empty.

https://channels.readthedocs.io/en/latest/channel_layer_spec.html#channel-semantics

【讨论】:

  • 但是如果连接稳定的话,我能保证一口气收到整个消息吗?例如,如果我使用socket.send("Hello There"),我是否可以确定整个消息已完全发送并且将在另一端完全接收,或者我是否需要使用一些缓冲技术或类似的东西来确保一切正常?发送和接收正确吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 2016-06-26
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多