史上最全的Websocket入门教程

websocket简介
websocket是什么?

答: 它是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
为什么需要websocket? 疑问? 我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?

答: 因为 HTTP 协议有一个缺陷:通信只能由客户端发起
     我们都知道轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开), 因此websocket应运而生。

简介

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。WebSocket协议基于TCP协议实现,包含初始的握手过程,以及后续的多次数据帧双向传输过程。其目的是在WebSocket应用和WebSocket服务器进行频繁双向通信时,可以使服务器避免打开多个HTTP连接进行工作来节约资源,提高了工作效率和资源利用率。
在这里插入图片描述
WebSocket目前支持两种统一资源标志符ws和wss,类似于HTTP和HTTPS。
实现原理

浏览器发出webSocket的连线请求,服务器发出响应,这个过程称为握手,握手的过程只需要一次,就可以实现持久连接。
握手与连接

浏览器发出连线请求,通过get可以表明此次连接的建立是以HTTP协议为基础的,返回101状态码。

如果不是101状态码,表示握手升级的过程失败了

101是Switching Protocols,表示服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送这个响应后的空档,将http升级到webSocket。

其中Upgrade和Connection字段告诉服务端,发起的是webSocket协议

Sec-WebSocket-Key是浏览器经过Base64加密后的密钥,用来和response里面的Sec-WebSocket-Accept进行比对验证

Sec-WebSocket-Version是当前的协议版本

Sec-WebSocket-Extensions是对WebSocket的协议扩展

服务器接到浏览器的连线请求返回结果如下:

Upgrade和Connection来告诉浏览器,服务已经是基于webSocket协议的了,让浏览器也遵循这个协议

Sec-WebSocket-Accept是服务端确认后并加密后的Sec-WebSocket-Accept

至此,webSocket连接成功,接下来就是webSocket的协议了。

客户端的简单示例:

var ws = new WebSocket("wss://echo.websocket.org");

ws.onopen = function(evt) {
  console.log("Connection open ...");
  ws.send("Hello WebSockets!");
};

ws.onmessage = function(evt) {
  console.log( "Received Message: " + evt.data);
  ws.close();
};

ws.onclose = function(evt) {
  console.log("Connection closed.");
}; 

ws.onerror = function(evt) {
  console.log("error!!!");
}; 

客户端的 API
以下 API 用于创建 WebSocket 对象
var ws = new WebSocket(‘ws://echo.websocket.org‘);

websocket 属性

ws.readyState
CONNECTING:值为0,表示正在连接。
OPEN:值为1,表示连接成功,可以通信了。
CLOSING:值为2,表示连接正在关闭。
CLOSED:值为3,表示连接已经关闭,或者打开连接失败。

ws.bufferedAmount
只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。
WebSocket 事件
事件     事件处理程     描述
open     ws.onopen     连接建立时触发
message     ws.onmessage     客户端接收服务端数据时触发
error     ws.onerror     通信发生错误时触发
close     ws.onclose     连接关闭时触发

如果要指定多个回调函数,可以使用addEventListener方法

ws.addEventListener(‘open‘, function (event) {
  ws.send(‘Hello Server!‘);
});
ws.addEventListener("close", function(event) {
  ...
  // handle close event
});
ws.addEventListener("message", function(event) {
  var data = event.data;
  ...
  // 处理数据
});

websocket 方法

方法 描述
ws.send() 使用连接发送数据
ws.close() 关闭链接

应用案例

原文地址:https://www.cnblogs.com/skycto/p/11470336.html

时间: 2024-11-07 12:19:58

史上最全的Websocket入门教程的相关文章

史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门

一.Python OpenCV 入门 欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定. OpenCV 用于各种图像和视频分析,如面部识别和检测,车牌阅读,照片编辑,高级机器人视觉,光学字符识别等等. 你将需要两个主要的库,第三个可选:python-OpenCV,Numpy 和 Matplotlib. Windows 用户: python-OpenCV:有其他的方法,但这是最简单的. 下载相应的 wheel(.whl)文件

.Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇

一.前言 经过上几篇的学习,现在我们已经掌握了ActiveX的整个开发过程,但要发挥ActiveX的真正威力,必须依靠JS.下面一起来学习吧! 二.JS调用ActiveX方法 只需在UserControl子类中(即自定义的ActiveX控件中),编写公共方法即可. C# [Guid("0203DABD-51B8-4E8E-A1EB-156950EE1668")] public partial class Uploader : UserControl, IObjectSafety { p

.Net魔法堂:史上最全的ActiveX开发教程——部署篇

一.前言 接<.Net魔法堂:史上最全的ActiveX开发教程——发布篇>,后我们继续来部署吧! 二. 挽起衣袖来部署   ActiveX的部署其实就是客户端安装ActiveX组件,对未签名和已签名的ActiveX,分别有对应的部署方式. 1. 部署未签名的ActiveX 未签名的ActiveX控件不受浏览器端信任,默认是不被允许安装的 1. 将网站加入 **可信站点** 2. 在“可信站点”和“Internet”下的 **自定义级别** 中确认“对未标记为可安全执行脚本的ActiveX控件初

史上最全面的SignalR系列教程-目录汇总

1.引言 最遗憾的不是把理想丢在路上,而是理想从未上路. 每一个将想法变成现实的人,都值得称赞和学习. 致正在奔跑的您! 2.SignalR介绍 SignalR实现服务器与客户端的实时通信 ,她是一个面向 ASP.NET 开发人员的库,可简化将实时 web 功能添加到应用程序的过程. 实时 web 功能是让服务器代码将内容推送到连接的客户端立即可用,而不是让服务器等待客户端请求新数据的能力. 3.百度百科给它的定义 实现实时通信. 什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可

史上最浅显易懂的RxJava入门教程

RxJava是一个神奇的框架,用法很简单,但内部实现有点复杂,代码逻辑有点绕.我读源码时,确实有点似懂非懂的感觉.网上关于RxJava源码分析的文章,源码贴了一大堆,代码逻辑绕来绕去的,让人看得云里雾里的.既然用拆轮子的方式来分析源码比较难啃,不如换种方式,以造轮子的方式,将源码中与性能.兼容性.扩展性有关的代码剔除,留下核心代码带大家揭秘 RxJava 的实现原理. 什么是RxJava ? Rx是Reactive Extensions的简写,翻译为响应的扩展.也就是通过由一方发出信息,另一方响

史上最全的Python电子书教程资源下载(转)

网上搜集的,点击即可下载,希望提供给有需要的人^_^   O'Reilly.Python.And.XML.pdf 2.02 MB   OReilly - Programming Python 2nd.pdf 6.98 MB   Orielly.Learning.Python.pdf 3.17 MB   Dive into Python-中文版(python研究,很好的书).chm 573.92 KB   Foundations of Python Network Programming, Sec

【分享】史上最全的物理学电子书教程资源下载

这是原始链接:http://www.hejizhan.com/html/xueke/140/ 供有需要的下载. 物理学史(26) 理论物理学(506)   ...(5) 数学物理(79) 相对论与引力场(94)   ...(19) 狭义相对论(26) 广义相对论(49) 量子力学(280)   ...(202) 高等量子力学(21) 量子场论(45) 量子电动力学(12) 统计物理学(48) 声学(45)   ...(25) 物理声学(3) 非线性声学(4) 超声学(1) 水声学(9) 应用声学

史上最全的ORACLE基础教程

ORACLE命令和语句挺多,全部记忆下来不现实,况且有不常用的指令.下面把大部分的指令做了记录和详细的注释.建议收藏.转发此篇文章,如果忘记可以翻出来查查.关注公众号it_learn获取更多学习资源 用户与权限 创建用户 create user 用户名 identified by 密码; 给用户修改密码 alter user 用户名 identified by 新密码; 修改自己的密码 password 用户名; 删除用户 drop user 用户名 [cascade]可选参数 cascade

[No00004F]史上最全Vim快捷键键位图(入门到进阶)

史上最全Vim快捷键键位重磅来袭!!学习Linux的朋友看过来啦,你是不是觉得Linux编辑器Vim操作复杂,步骤繁琐呢?Linux工程师是不是想大幅度提升自己的工作效率呢? 经典版        下面这个键位图应该是大家最常看见的经典版了. 对应的简体中文版. 其实经典版是一系列的入门教程键位图的组合结果,下面是不同编辑模式下的键位图. 1 2 3 4 5 6 7 入门版        基本操作的入门版.进阶版        增强版        下图是一个更新时间较新的现代版,含有的信息也更