1、什么是WebSocket ?
概念
-
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的网络传输协议。 -
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 -
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
特点
-
TCP连接,于HTTP协议兼容 -
双向通信,主动推送(服务器端向客户端) -
无同源限制,协议标识符是ws(加密是wss)
通信方式:
对比分析
相关内容
2、使用
ws常用前端库
学习地址
第一个websocket应用
前置:应用分客户端(client---浏览器端)和服务端(server---node作为服务端)
-
服务端(node) 空目录
npm init -y
npm install ws 服务端 index.js
const WebSocket = require('ws')
?
const wss = new WebSocket.Server({
?port: 3000
})
?
wss.on('connection', function connection (ws) {
?console.log('一个客户以连接');
}) 客户端 index.html -
客户端 ? var ws = new WebSocket('ws://localhost:3000')
? ws.onopen = function () {
? ? console.log(ws.readyState);
? ? ws.send('client:hello')
? } -
注意事项:
-
当服务器接收到来自客户端消息的时候,出现编码问题,显示为GBK编码格式,例如:<Buffer 63 6c 69 65 6e 74 20 3a 20 68 65 6c 6c 6f> ,这里安装依赖进行解码
3、极简聊天室 心跳检测
4、socket.io socket.io官网 W3Cschool 特点:
-
易用性:socket.io封装了服务端和客户端,使用起来非常简单方便。
-
内置心跳检测:短线重连 -
广播自动过滤当前发消息用户
-
跨平台:socket.io支持跨平台,这就意味着你有了更多的选择,可以在自己喜欢的平台下开发实时应用。 -
自适应:它会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化,而且支持的浏览器最低达IE5.5。
初步使用
-
服务端 空目录
npm init -y
npm i socket-io
npm i express //server.js
const app = require('express')();
const http = require('http').createServer(app);
const io = require('socket.io')(http)
?
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html') //创建默认打开文件
})
?
io.on('connection', function (socket) {
console.log('a socket is connected');
socket.on('chatEvent', function (msg) { //监听客户端注册的charEvent事件,接收发送过来的消息
? console.log(msg);
? // socket.send('server 收到')
? //广播,向聊天室其他成员发送消息,本人并不会接收,同时也无需接收
? socket.broadcast.emit('SreverMsg', msg) //服务器注册ServerMsg事件,向所有用户广播,广播消息,实现群聊功能,自动过滤当前用户
//单独向当前用户发送消息
? socket.send(msg)
})
})
http.listen(3000, function () {
console.log("3000端口已开启");
}) -
客户端 //index.html
<!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>
<style>
? input {
? ? outline-style: none;
? ? border: 1px solid #ccc;
? ? border-radius: 3px;
? ? padding: 6px;
? ? width: 300px;
? ? font-size: 14px;
? ? font-family: "Microsoft soft";
? }
?
? input:focus {
? ? border-color: #66afe9;
? ? outline: 0;
? ? -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
? ? box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6)
? }
</style>
</head>
<input type="text" id='msg'>
<button id='btn'>发送消息</button>
<body>
<!-- <script src="/socket.io/socket.io.js"></script> -->
<script src="https://cdn.bootcdn.net/ajax/libs/socket.io/4.5.2/socket.io.js"></script>
<script>
? var socket = io() //初始化
? document.getElementById('btn').addEventListener('click', function (e) {
? ? var value = document.getElementById('msg').value
? ? socket.emit('chatEvent', value) //注册发送消息事件,向服务器发送消息
? ? document.getElementById('msg').value = ''
? })
//监听服务器单独发送的消息 ? ?
? socket.on('message', function (msg) {
? ? console.log(msg);
? })
? //监听服务器注册的广播事件,接收消息
? socket.on('SreverMsg', function (msg) {
? ? console.log(msg);
? })
</script>
</body>
</html> -
socket.js引入方式
|