【问题标题】:understanding websockets on the server side了解服务器端的 websockets
【发布时间】:2012-05-25 20:00:21
【问题描述】:

我在理解 websocket 通信方面有一些问题。 AFAIU,在客户端,它是这样工作的:

  1. 从客户端,使用“new WebSocket('ws://blahblah')”创建一个新的 Socket 处理程序
  2. 然后使用 onOpen() 方法知道我们已连接到 WS 服务器
  3. 使用 onMessage() 方法,已知从 WS Server 收到消息
  4. OnClose() 方法指示套接字连接已关闭

所以从客户的角度来看,它很清楚。 但是从服务器的角度来看,流程是如何进行的(如上面的客户端)以及 websocket 服务器进程的确切含义以及我们的意思是什么时候通信发生在 TCP 上以及我们如何检查它(如果问题是我的道歉非常基础)

谁能解释一下。 提前致谢

【问题讨论】:

    标签: java websocket


    【解决方案1】:

    在服务器端,它实际上取决于 websockets 库的实现、语言和 API,或者您自己使用的实现。

    此描述仅适用于 WebSockets 的 RAW 实现,并非基于使用任何库来处理 WebSockets 协议。 jWebSockets (Java)、SignalR、socket.io 等库绝对有另一个进程可以使用 WebSockets。

    如果我们谈论的是原始套接字上的原始实现,那么流程是这样的:

    1. 创建服务器端TCP socket,绑定特定端口并监听,然后进入接受状态。接受可以是阻塞的或非阻塞的。我使用.Net,并进行了异步接受,这样每次连接到服务器时都会触发方法。 1b。通过JS调用客户端:new WebSocket(...);
    2. 接受新套接字后,它必须开始接收数据。 TCP 协议是基于流的,而不是基于消息的。
    3. WebSockets 协议要求在进行通信之前完成 WebSockets 的 HTTP 握手。因此,在接受新套接字后,您立即开始接收数据,首先您将收到握手数据 - 一些文本行。
    4. 继续握手过程。这意味着读取握手数据,并在服务器端生成响应握手数据并将其发送到WebSocket。 4b。如果握手数据将被客户端(浏览器)验证和验证,你会得到回调“onopen”,否则你可能会得到“onerror”和“onclose”。
    5. 握手完成后,您可以接收和发送消息。消息是基于 WebSockets 协议的数据帧(非原始)。 WebSockets 是基于 MESSAGE 的协议。因此,您必须确保在对数据进行逻辑处理之前读取特定数量的消息数据。
    6. 为了在服务器端接收数据,如果您使用自己的实现,您必须实现从 TCP 套接字流读取。为此,您将始终只想读取 2 个字节,如果有的话(2 个字节) - 这是标头数据,根据协议数据帧规范对其进行解码,并继续读取其余数据以找出是否有masking 然后读取掩码字节和长度。这一切都在标题中。但标题的长度可能略有不同。这就是为什么您必须先只读取 2 个字节,然后再读取一些字节的原因。获得长度后,您必须从 TCP 套接字流中准确读取此长度的字节。在所有读取之后,实际数据被取消屏蔽(如果启用了屏蔽,根据我的经验,它总是启用),之后,您可以让套接字从头开始读取一些其他数据。在阅读完当前消息之前不要开始阅读新消息。
    7. 在读取并取消屏蔽消息后,您将获得原始数据,在大多数情况下,它只是您使用“socket.send("...");”从客户端发送的字符串。
    8. 要发送数据,你必须获取原始字符串数据,然后使用UTF8编码获取字符串的字节,然后用数据帧覆盖它,所以它与读取相反,唯一的区别是你不应该做掩码。所以从服务器到客户端的数据不会被屏蔽。
    9. 制作二进制文件并发送后,如果一切正常,您可能会在客户端“onmessage”中收到您发送的数据。

    客户端永远不会收到部分数据或无序数据。它将始终按照您发送的顺序接收数据包,并且始终按照您发送的顺序接收数据包。 服务器可能会部分基于低级 TCP 层进程接收数据。但将始终收到订购。

    此协议可靠且有序。

    最流行的 WebSockets 协议规范RFC 6455,请记住,iOS 使用另一种规范,它们可能无法交叉兼容,这意味着您需要专门为不同的协议实现创建另一个握手功能和数据框架。

    【讨论】:

    • 优秀的答案。我正在尝试从 Java 服务器中的 binaryjs 读取字节流。考虑到没有 binaryjs Java 服务器,按照这种方法可以吗?
    • 是的。上面的文字描述了适用于任何 WebSocket 应用程序的 WebSocket 传输协议,而 binaryjs 使用 WS 作为传输协议。但是您必须在它之上实现遵循 binaryjs 规范的数据协议。
    【解决方案2】:

    握手完成后,就可以收发消息了。留言 是基于 WebSockets 协议的数据帧(非原始)。和 WebSockets 是基于 MESSAGE 的协议。所以你必须确保你阅读了具体的 进行逻辑处理之前的消息数据量。

    这里有更多信息:

    因此,服务器可以将消息分段到多个 WebSocket 帧中发送给客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-21
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 2016-11-12
      • 2016-03-08
      • 1970-01-01
      相关资源
      最近更新 更多