目录
定义
websocket是一个互联网传输协议(http也是一个互联网传输协议)
websocket是一个持续性互联网传输协议 不像http
-
http是一个单次传输协议 每次想进行数据交互都必须先建立浏览器和服务器之间的连接 并且 这个连接会在数据交互结束之后 断开
-
websocket是一个持续性传输协议 相当于在服务器和浏览器之间 建立起了一个持续存在的连接 我们可以在这个连接之上 进行无限制的数据交互
websocket的应用场景
-
websocket协议 多用于 客服系统、聊天室系统、直播系统等
websocket的开发
-
在node中 我们使用一个第三方模块 来实现websocket服务器的开发 这个模块叫做——socket.io
-
编写websocket服务器的步骤如下
-
1.下载第三方模块socket.io:npm i socket.io@2
-
2.引入并使用
-
let socket = require("socket.io");
-
-
3.包装websocket服务器
-
let express = require("express"); let app = express(); //声明一个变量 接收listen方法函数调用表达式的值(返回值) 这个返回值就是node服务器 let server = app.listen("3000",()=>{ console.log("服务器正在运行...") }) //引入websocket let websocket = require("socket.io"); //上述server就是我们获取到的node服务器 我们下面 使用websocket来将其包装为socket服务器 //我们引入的websocket 是一个函数 这个函数就可以将node服务器包装为socket服务器 //用法:websocket(node服务器) let io = websocket(server); //给socket服务器对象 添加connection(连接)事件 这个事件用来监听是否有浏览器和我的socket服务器建立了连接 任何一个浏览器和socket服务器建立了连接 都会触发connection事件 //node中添加事件的写法 类似于jquery中的on方法绑定事件 io.on("connection",web=>{ //事件处理函数中的第一个形参(web) 表示连接对象 console.log("建立连接成功") })
-
-
-
浏览器连接socket服务器的代码步骤如下
-
1.任何一个浏览器页面如果想访问websocket服务器 都需要先引入websocket服务器提供的一个js文件,这个js文件的引用地址为——"websocket服务器地址/socket.io/socket.io.js"
-
2.引入上述js文件后 就可以得到该js文件提供的一个函数——io 这个io函数就是用来建立和socket服务器之间的连接并进行数据交互。
-
3.建立连接:io("socket服务器地址")
-
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <!--引入socket.io.js--> <script src="http://127.0.0.1:3000/socket.io/socket.io.js"></script> <script> //建立连接 io("http://127.0.0.1:3000") </script> </body> </html>
-
-
-
websocket服务器和浏览器之间的数据交互方式
-
websocket服务器和浏览器之间的交互方式为 —— 发布和订阅模式
-
也就是说 服务器和浏览器二者进行交互的时候 一定是 一方发布数据 另一方订阅数据 数据才能成功进行交互 缺少任意一个步骤都无法成功交互数据
-
发布订阅的写法
-
//在服务器和浏览器中 都是相同的 //发布 连接对象.emit("自定义事件名",要发布的数据); //订阅 是通过给连接对象 添加对应的自定义事件 来实现接收发布的数据的效果 连接对象.on("对应的自定义事件名",res=>{ //res形参就是接收到的发布数据 })
-
-
-
websocket服务器向浏览器广播数据
-
websocket服务器进行广播使用的对象不同 不再使用连接对象 而是使用 socket服务器对象.sockets进行发布就可以实现广播效果
-
let express = require("express"); let app = express(); //声明一个变量 接收listen方法函数调用表达式的值(返回值) 这个返回值就是node服务器 let server = app.listen("3000",()=>{ console.log("服务器正在运行...") }) //引入websocket let websocket = require("socket.io"); //上述server就是我们获取到的node服务器 我们下面 使用websocket来将其包装为socket服务器 //我们引入的websocket 是一个函数 这个函数就可以将node服务器包装为socket服务器 //用法:websocket(node服务器) let io = websocket(server); //给socket服务器对象 添加connection(连接)事件 这个事件用来监听是否有浏览器和我的socket服务器建立了连接 任何一个浏览器和socket服务器建立了连接 都会触发connection事件 //node中添加事件的写法 类似于jquery中的on方法绑定事件 io.on("connection",web=>{ //事件处理函数中的第一个形参(web) 表示连接对象 console.log("建立连接成功"); //广播发布 io.sockets.emit("自定义事件名",要发布的数据) })
-
-
分房间群聊
-
socket服务器可以实现分房间群聊 前提是需要浏览器提交房间号 服务器就可以将当前用户加入到对应的房间中进行群聊了
-
let express = require("express"); let app = express(); //声明一个变量 接收listen方法函数调用表达式的值(返回值) 这个返回值就是node服务器 let server = app.listen("3000",()=>{ console.log("服务器正在运行...") }) //引入websocket let websocket = require("socket.io"); //上述server就是我们获取到的node服务器 我们下面 使用websocket来将其包装为socket服务器 //我们引入的websocket 是一个函数 这个函数就可以将node服务器包装为socket服务器 //用法:websocket(node服务器) let io = websocket(server); //给socket服务器对象 添加connection(连接)事件 这个事件用来监听是否有浏览器和我的socket服务器建立了连接 任何一个浏览器和socket服务器建立了连接 都会触发connection事件 //node中添加事件的写法 类似于jquery中的on方法绑定事件 io.on("connection",web=>{ //事件处理函数中的第一个形参(web) 表示连接对象 console.log("建立连接成功"); //广播发布 io.sockets.emit("自定义事件名",要发布的数据); //接收房间号 socket服务器接收数据的方式是:连接对象.handshake.query.要接受的数据的键名 let id = web.handshake.query.id; //判断id如果提交了 就给用户加入到指定id的房间去 进行群聊 //join: 用法:连接对象.join(房间id,()=>{ 加入成功后会执行的回调函数 }) web.join(id,()=>{ web.emit("welcome","欢迎进入“+id+”号直播间"); //针对指定房间发布信息 服务器对象.to(id).emit("welcome","欢迎进入“+id+”号直播间"); }) })
-
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <!--引入socket.io.js--> <script src="http://127.0.0.1:3000/socket.io/socket.io.js"></script> <script> //建立连接 并提交房间号 let web = io("http://127.0.0.1:3000?id=1"); </script> </body> </html>
-
注意:由于websocket建立的是管道连接 因此连接会持续存在 如果想断掉连接 需要停止服务器运行