WebSocket的全双工通信方式详解
全双工通信与半双工通信的区别
半双工:参考对讲机,A:能不能听到我说话,over
B:可以可以,over
全双工:参考打电话,A:哎,老王啊!@#!#¥#@!#
B:@#¥@¥@¥#@
半双工也可以理解为只能过一辆车的桥,全双工为双向各一车道的桥。前者同时只有一个方向可以过,后者来回双向都可以同时过。
为什么需要 WebSocket?
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。
举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。
WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
其他特点包括:
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于 HTTP 请求每次都要携带完整的头部,此项开销显著减少了。
(4)长连接,保持连接状态。与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
一句话总结一下 WebSocket:
WebSocket 是 HTML5 开始提供的一种独立在单个 TCP 连接上进行全双工通讯的有状态的协议(它不同于无状态的 HTTP),并且还能支持二进制帧、扩展协议、部分自定义的子协议、压缩等特性。
目前看来,WebSocket 是可以完美替代 AJAX 轮询和 Comet 。
三、客户端的简单示例
WebSocket 的用法相当简单。
1. websocket构造函数
用于创建一个webSocket实例,执行后,客户端就会与服务端连接
2. webSocket.readyState
readyState属性返回实例对象的当前状态,共有四种。
CONNECTING:值为0,表示正在连接。
OPEN:值为1,表示连接成功,可以通信了。
CLOSING:值为2,表示连接正在关闭。
CLOSED:值为3,表示连接已经关闭,或者打开连接失败
例如:if(ws.readyState ==WebSocket.CONNECTING){}
3 . webSocket.send()
send方法用于向服务器发送数据
4 . webSocket.onmessage()
用于指定收到服务器数据后的回调函数
5.webSocket.onclose
用于指定连接关闭后的回调函数。
上一篇: 理解半双工、全双工与半工通信的差异详解
下一篇: 全双工与半双工:一次清晰的解释对比
推荐阅读
-
详解Ty2y平台配置参数的JavaScript混淆加密方式
-
C语言:探索函数调用的三种方式 - 详解第二种方法
-
Intellij IDEA 插件开发入门详解 - 如何添加 Application 和 Project Component,并创建 Action? 在本文中,我们将详细介绍如何在 IntelliJ IDEA 中添加 Application 和 Project Component,并且通过这些组件来创建一个简单的 Action。 首先,我们将在 src 目录上使用 Alt+Insert 快捷键打开 New 对话框,然后从中选择 Application Component 并输入名称如 MyComponent。接下来,我们在 MyComponent 类中添加一个 sayHello 方法并编写相关逻辑。 然后,我们需要为我们的插件添加一个 Action,使用户可以通过菜单或其它方式访问它。为此,我们将创建一个新的类 SayHelloAction 继承自 AnAction 类,并在 actionPerformed 方法中获取 Application 和 MyComponent 对象,最后调用 MyComponent 的 sayHello 方法。 最后,我们需要为我们的插件配置相关的文件以确保它可以正常运行。在本文中,我们将详细介绍如何进行这些配置。
-
6 种 Linux 进程间通信方法:详解 IPC 的概念与原理
-
玩转操作系统!详解进程通信的8种方法:共享存储、管道通信、消息传递...
-
玩转C语言:进程间通信的信号方式解析
-
在Vue应用里,实现页面间传递数据的两种常用路由参数传递法及其组件内接收入参方式详解
-
Vue中的参数传递:组件间通信、路由跳转传参以及Vuex实战 - 之二:路由传参详解
-
详解在React中运用react-router-dom的不同方法传递路由参数(适用于v5.x和v6.x版本) - 介绍三类路由值传输方式 (v6.x 版本)
-
全新谷歌研发:QUIC协议详解 - 更快、更高效的通信技术