Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 了解服务器端的WebSocket_Java_Websocket - Fatal编程技术网

Java 了解服务器端的WebSocket

Java 了解服务器端的WebSocket,java,websocket,Java,Websocket,我对理解websocket通信有一些疑问。AFAIU,在客户端,它的工作原理如下: 从客户端,使用“newwebsocket('ws://blahblah')创建一个新的套接字处理程序 然后使用onOpen()方法就知道我们连接到了WS-server 使用onMessage()method,已知已从WS-Server接收到消息 OnClose()方法指示套接字连接关闭 因此,从客户的角度来看,它是明确的。 但是,从服务器的角度来看,流是如何进行的(对于客户端,如上所述),websocket服务器

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

  • 从客户端,使用“newwebsocket('ws://blahblah')创建一个新的套接字处理程序
  • 然后使用onOpen()方法就知道我们连接到了WS-server
  • 使用onMessage()method,已知已从WS-Server接收到消息
  • OnClose()方法指示套接字连接关闭
  • 因此,从客户的角度来看,它是明确的。 但是,从服务器的角度来看,流是如何进行的(对于客户端,如上所述),websocket服务器进程的确切含义是什么,什么时候通信发生在TCP上,以及如何检查(如果问题非常基本,我的应用程序)

    谁能解释一下吗。
    在服务器端,这实际上取决于websockets库的实现、语言和API,或者您自己使用的实现

    此描述仅适用于WebSockets的原始实现,并不基于使用任何库来处理WebSockets协议。 诸如jWebSockets(Java)、SignalR、socket.io和其他库将绝对有另一个处理WebSockets的进程

    若我们讨论的是原始套接字上的原始实现,那个么过程如下所示:

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

    该协议是可靠和有序的

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

    握手完成后,您可以接收和发送消息。信息 是基于WebSockets协议的数据框架(非原始)。和网袋 是基于消息的协议。所以你必须确保你读的是具体的 继续进行数据逻辑处理之前的消息数据量

    这里有更多关于这方面的信息:


    因此,服务器可以在多个WebSocket框架中对消息进行分段,然后发送到客户端。

    回答得很好。我正在尝试从Java服务器中的中读取字节流。考虑到没有binaryjs Java服务器,采用这种方法是否可行?是的。上面的文本描述了适用于任何WebSocket应用程序的WebSocket传输协议,binaryjs使用WS作为传输协议。但您必须在其上实现遵循binaryjs规范的数据协议。