了解服务器端的websockets

siv*_*iva 4 java websocket

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

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

所以从客户的角度来看它很清楚 但是从服务器的角度来看,流程是如何进行的(如上面的客户端)以及websocket服务器进程究竟意味着什么,以及我们的意思是什么时候我们的意思是在TCP上进行通信,我们如何检查(我的aplologies,如果问题是非常基本的)

有人可以解释一下.在先谢谢你

mok*_*oka 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",其中包含您发送的数据.

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

该协议是可靠和有序的.

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