文章目录

  • 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学习笔记相关推荐

  1. 【WebSocket】WebSocket学习笔记

    目录 什么是WebSocket? 为什么需要WebSocket WebSocket与HTTP的区别 WebSocket协议的原理 WebSocket的优缺点 WebSocket应用场景 WebSock ...

  2. websocket学习笔记 go语言使用 gorilla/websocket实现实时聊天项目

    完整代码:https://github.com/diguacheng/webchat 扩展包 gorilla/websocket的几个重要函数 协议升级 ,1)先初始化upgrader,再调用其upg ...

  3. websocket 获取连接id_Swoole学习笔记七:搭建WebSocket长连接 之 使用 USER_ID 作为身份凭证...

    Swoole学习笔记七:搭建WebSocket长连接 之 使用 USER_ID 作为身份凭证 2年前 阅读 3678 评论 0 喜欢 0 ### 0.前言 前面基本的WebSocket操作,我们基本都 ...

  4. Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例

    在之前的Netty相关学习笔记中,学习了如何去实现聊天室的服务段,这里我们来实现聊天室的客户端,聊天室的客户端使用的是Html5和WebSocket实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...

  5. ESP32 单片机学习笔记 - 08 - WebSocket客户端

    前言,终于要到网络模型的最后一层,第四层,应用层,http.websocket的实践了. 文章目录 ESP32 单片机学习笔记 - 08 - WebSocket客户端 一.应用层协议 科普概念 二.编 ...

  6. Go语学习笔记 - websocket gorilla(附测试代码) | 从零开始Go语言

    目录 项目结构 消息结构 服务端代码 定义客户端行为 服务启动 测试代码 总结 学习笔记,写到哪是哪. websocket也是常用的协议了,在上一篇中主要测试使用了一下grpc. 下面我会把代码贴出来 ...

  7. Puppeteer 学习笔记及基本用法

    Puppeteer 学习笔记及基本用法 Puppeteer 安装 语法 基本语法 API 分层结构 加载导航页面 等待元素.请求.响应 自定义等待 元素定位 用户模拟操作 请求拦截 获取 WebSoc ...

  8. Spring Boot学习笔记-基础(2)

    Spring Boot学习笔记-基础(2) Spring Boot 优点: – 快速创建独立运行的Spring项目以及与主流框架集成 – 使用嵌入式的Servlet容器,应用无需打成WAR包 – st ...

  9. .Net Core + 微信赋能企业级智能客服系统--学习笔记

    摘要 围绕目前需求猛增的微信及移动端企业智能客服业务,利用 .NET Core 的一系列优秀特性及 SignalR 模块打造全双工.跨微信/QQ/钉钉等应用平台.跨系统平台.跨终端.支持企业级并发的移 ...

最新文章

  1. Struts2文件上传
  2. 【Spring框架家族】mybatis generator代码自动生成(看得上眼直接拿去用即可)
  3. [ATF]-ATF的RT_SVC的详解(runtime service)
  4. ACM入门之【ST表/RMQ】
  5. 32位和64位机器上C语言数据类型的大小
  6. 《Ext JS权威指南》——1.2节JSON概述
  7. 金融评分卡项目—6.互联网金融业贷款申请评分卡介绍
  8. QT6.1.2下载和安装教程
  9. 架构一个可承受千万级访问量的动态扩展CMS
  10. 思科ASDM导入与实战配置经验总结-操作系统版本V842
  11. 计算机硬件类的相关课程,计算机硬件类课程,hardware course,音标,读音,翻译,英文例句,英语词典...
  12. Opencv中waitKey()
  13. Lieges of Legendre CodeForces - 603C (博弈论,SG找规律)
  14. 什么专业的人适合学嵌入式?
  15. Docker:网络模式详解
  16. Python之王者荣耀文字游戏,以及小知识回顾
  17. Linux下安装Perl模块(含CPAN方法)
  18. python 源码编译 without_vcmi(魔法门英雄无敌3 - 开源复刻版) 源码编译(示例代码)...
  19. Java毕设项目社区团购系统计算机(附源码+系统+数据库+LW)
  20. [技美CG][DX12实战]Demo 运行【DX12】【VS2022】【龙书】【新手开箱可用】

热门文章

  1. java中产生死锁的原因及如何避免
  2. leetcode-- 124. 二叉树中的最大路径和
  3. VUE如何操作DOM
  4. @value 数组_数据结构与算法:12 数组与稀疏矩阵
  5. 华为k662c的虚拟服务器,华为k662c路由器怎么设置
  6. python的主要版本_Python目前主要有( )两个主要版本。_学小易找答案
  7. Android对话框dialog大全
  8. android布局DSL,android – 使用自定义Anko布局DSL解除警报对话框
  9. request body 里丢东西了_26. Scrapy 框架-模拟登录-Request、Response
  10. python注册用户名和密码登录_python实现自动登录需要用户名和密码的网站