了解服务器端的websockets

时间:2012-05-18 08:37:19

标签: java websocket

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

  1. 从客户端,使用“new WebSocket('ws:// blahblah')”
  2. 创建一个新的Socket处理程序
  3. 然后使用onOpen()方法,它已知我们已连接到WS服务器
  4. 使用onMessage()方法,已知从WS服务器收到消息
  5. OnClose()方法指示套接字连接已关闭
  6. 所以从客户的角度来看它很清楚。 但是从服务器的角度来看,流程是如何进行的(如上面的客户端)以及websocket服务器进程究竟意味着什么,以及我们在TCP上进行通信的时间到底是什么时候我们如何检查(如果问题是,我的aplologies)非常基本的)

    请有人解释一下。 先谢谢

2 个答案:

答案 0 :(得分:5)

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

此描述仅适用于WebSockets的RAW实现,并不基于使用任何库来使用WebSockets协议。 诸如jWebSockets(Java),SignalR,socket.io等库将拥有与WebSockets一起使用的绝对另一个进程。

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

  1. 创建服务器端TCP套接字,绑定到特定端口并监听它,然后继续接受状态。接受可以是阻止或非阻塞。我使用.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个字节) - 这是标题数据,根据协议数据成帧规范对其进行解码,并继续读取其余数据以查明是否存在然后屏蔽然后读取屏蔽字节和长度。一切都在标题中。但标题长度可能略有不同。这就是为什么你必须先读取2个字节,然后再读取一些。获得长度后,您必须从TCP套接字流中读取这个字节长度。在所有读取之后,实际数据被解除屏蔽(如果启用了屏蔽,根据我的经验,它总是被启用),之后,您可以将socket从一开始就读取其他一些数据。在完成阅读当前信息之前不要开始阅读新信息。
  7. 读取消息并取消屏蔽后,您将拥有原始数据,在大多数情况下,它只是您使用“socket.send(”...“)从客户端发送的字符串;”。
  8. 要发送数据,你必须获取原始字符串数据,然后使用UTF8编码获取字符串字节,并在用数据框架覆盖后,所以它与读取相反,唯一的区别是你不应该做掩蔽。因此,从服务器到客户端数据不会被屏蔽。
  9. 在您创建二进制文件并发送后,如果一切正常,您可能会在客户端收到“onmessage”,其中包含您发送的数据。
  10. 客户端永远不会收到部分数据或无序数据。它将始终按您发送的顺序接收数据包,并始终按您发送的顺序接收数据包 服务器可能部分地基于低级TCP层进程接收数据。但总会收到订单。

    此协议可靠且有序。

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

答案 1 :(得分:0)

  

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

这里有一些更多的信息:

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