websocket学习笔记
文章目录
- websocket学习笔记
- 实现的方式
websocket学习笔记
WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
为什么需要 WebSocket ?
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。
举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。
这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。
轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。
随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。
我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据;这种客户端是主动方,服务端是被动方的传统Web模式 对于信息变化不频繁的Web应用来说造成的麻烦较小,而对于涉及实时信息的Web应用却带来了很大的不便,如带有即时通信、实时数据、订阅推送等功能的应用。
实现的方式
//先握手,并查看客户端的浏览器是否支持websocket协议
//连接发生错误的回调方法
ws.onerror = function () {alert("WebSocket连接发生错误");
};//连接成功建立的回调方法
ws.onopen = function () {alert("WebSocket连接成功");
}//接收到消息的回调方法,websocket的controller里的onMessage方法session_to传过来的值
ws.onmessage = function (event) {alert(event.data);
}//连接关闭的回调方法
ws.onclose = function () {alert("WebSocket连接关闭");
}//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {closeWebSocket();
}function closeWebSocket(){ws.close();
}
nodejs实现websocket:
let ws = require('ws'); //引入websocket模块
let uuid = require('uuid'); //引入创建唯一id模块
let socketServer = ws.Server;
let clientIndex = 0;
let wss = new socketServer({port: 8090}, ()=>{console.log("服务启动,端口8090.")
}); //创建websocketServer实例监听8090端口let clients = []; //创建客户端列表,用于保存客户端及相关连接信息/*** 广播所有客户端消息* @param {String} type 广播方式(admin为系统消息,user为用户消息)* @param {String} message 消息* @param {String} nickname 用户昵称,广播方式为admin时可以不存在*/
function broadcastSend(type, message, nickname) {console.log("type:"+type)clients.forEach(function(v, i) {if(v.ws.readyState === ws.OPEN) {v.ws.send(JSON.stringify({"type": type,"nickname": nickname,"message": message}));}})
}//定时发送图表数据
function echartData() {function sortNumber(a,b){return a-b;//升序}//测试数据var iArray = [];function getRamdon(start, end) {var temp = end - start + 1; //91return Math.abs(Math.floor(Math.random()*temp)) + start; //从start开始}for(var i=0; i < 10; i++) {iArray.push(getRamdon(100,1000)) //循环10次,添加10个数在数组里}iArray.sort(sortNumber);return iArray;
}var inter = null;
function echartSend() {//第一次,以后每5秒更新一次var arr = echartData();broadcastSend("echart", arr, "system");if (inter) clearInterval(inter);inter = setInterval(function() {var arr = echartData();broadcastSend("echart", arr, "system");}, 5000)
}//监听连接
wss.on('connection', function(ws) {let client_uuid = uuid.v4();let nickname = `AnonymousUser${clientIndex++}`;clients.push({"id": client_uuid,"ws": ws,"nickname": nickname});//发送图表数据echartSend();console.log(`client ${client_uuid} connected`);/*** 关闭服务,从客户端监听列表删除*/function closeSocket() {for(let i = 0; i < clients.length; i++) {if(clients[i].id == client_uuid) {let disconnect_message = `${nickname} has disconnected`;broadcastSend("notification", disconnect_message, nickname);clients.splice(i, 1);}}//无客户端时停止定时器if (clients.length == 0){console.log("无客户端连接,清除定时器。")if (inter) clearInterval(inter);}}/*监听消息*/ws.on('message', function(message) {if(message.indexOf('/nick') === 0) {let nickname_array = message.split('_');if(nickname_array.length >= 2) {let old_nickname = nickname;nickname = nickname_array[1];let nickname_message = `Client ${old_nickname} change to ${nickname}`;broadcastSend("nick_update", nickname_message, nickname);}} else {broadcastSend("message", message, nickname);}});/*监听断开连接*/ws.on('close', function() {closeSocket();})
})
【其他代码可参考】https://gitee.com/monkeyhlj/vue-learning/tree/master/20210809-WebSocket%E5%AD%A6%E4%B9%A0
【Java实现可参考】Java实现websocket
websocket学习笔记相关推荐
- 【WebSocket】WebSocket学习笔记
目录 什么是WebSocket? 为什么需要WebSocket WebSocket与HTTP的区别 WebSocket协议的原理 WebSocket的优缺点 WebSocket应用场景 WebSock ...
- websocket学习笔记 go语言使用 gorilla/websocket实现实时聊天项目
完整代码:https://github.com/diguacheng/webchat 扩展包 gorilla/websocket的几个重要函数 协议升级 ,1)先初始化upgrader,再调用其upg ...
- websocket 获取连接id_Swoole学习笔记七:搭建WebSocket长连接 之 使用 USER_ID 作为身份凭证...
Swoole学习笔记七:搭建WebSocket长连接 之 使用 USER_ID 作为身份凭证 2年前 阅读 3678 评论 0 喜欢 0 ### 0.前言 前面基本的WebSocket操作,我们基本都 ...
- Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例
在之前的Netty相关学习笔记中,学习了如何去实现聊天室的服务段,这里我们来实现聊天室的客户端,聊天室的客户端使用的是Html5和WebSocket实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...
- ESP32 单片机学习笔记 - 08 - WebSocket客户端
前言,终于要到网络模型的最后一层,第四层,应用层,http.websocket的实践了. 文章目录 ESP32 单片机学习笔记 - 08 - WebSocket客户端 一.应用层协议 科普概念 二.编 ...
- Go语学习笔记 - websocket gorilla(附测试代码) | 从零开始Go语言
目录 项目结构 消息结构 服务端代码 定义客户端行为 服务启动 测试代码 总结 学习笔记,写到哪是哪. websocket也是常用的协议了,在上一篇中主要测试使用了一下grpc. 下面我会把代码贴出来 ...
- Puppeteer 学习笔记及基本用法
Puppeteer 学习笔记及基本用法 Puppeteer 安装 语法 基本语法 API 分层结构 加载导航页面 等待元素.请求.响应 自定义等待 元素定位 用户模拟操作 请求拦截 获取 WebSoc ...
- Spring Boot学习笔记-基础(2)
Spring Boot学习笔记-基础(2) Spring Boot 优点: – 快速创建独立运行的Spring项目以及与主流框架集成 – 使用嵌入式的Servlet容器,应用无需打成WAR包 – st ...
- .Net Core + 微信赋能企业级智能客服系统--学习笔记
摘要 围绕目前需求猛增的微信及移动端企业智能客服业务,利用 .NET Core 的一系列优秀特性及 SignalR 模块打造全双工.跨微信/QQ/钉钉等应用平台.跨系统平台.跨终端.支持企业级并发的移 ...
最新文章
- Struts2文件上传
- 【Spring框架家族】mybatis generator代码自动生成(看得上眼直接拿去用即可)
- [ATF]-ATF的RT_SVC的详解(runtime service)
- ACM入门之【ST表/RMQ】
- 32位和64位机器上C语言数据类型的大小
- 《Ext JS权威指南》——1.2节JSON概述
- 金融评分卡项目—6.互联网金融业贷款申请评分卡介绍
- QT6.1.2下载和安装教程
- 架构一个可承受千万级访问量的动态扩展CMS
- 思科ASDM导入与实战配置经验总结-操作系统版本V842
- 计算机硬件类的相关课程,计算机硬件类课程,hardware course,音标,读音,翻译,英文例句,英语词典...
- Opencv中waitKey()
- Lieges of Legendre CodeForces - 603C (博弈论,SG找规律)
- 什么专业的人适合学嵌入式?
- Docker:网络模式详解
- Python之王者荣耀文字游戏,以及小知识回顾
- Linux下安装Perl模块(含CPAN方法)
- python 源码编译 without_vcmi(魔法门英雄无敌3 - 开源复刻版) 源码编译(示例代码)...
- Java毕设项目社区团购系统计算机(附源码+系统+数据库+LW)
- [技美CG][DX12实战]Demo 运行【DX12】【VS2022】【龙书】【新手开箱可用】
热门文章
- java中产生死锁的原因及如何避免
- leetcode-- 124. 二叉树中的最大路径和
- VUE如何操作DOM
- @value 数组_数据结构与算法:12 数组与稀疏矩阵
- 华为k662c的虚拟服务器,华为k662c路由器怎么设置
- python的主要版本_Python目前主要有( )两个主要版本。_学小易找答案
- Android对话框dialog大全
- android布局DSL,android – 使用自定义Anko布局DSL解除警报对话框
- request body 里丢东西了_26. Scrapy 框架-模拟登录-Request、Response
- python注册用户名和密码登录_python实现自动登录需要用户名和密码的网站