一、原生
WebSocket的原生写法比较恶心,最恶心的要连接成功之后处理的数据都是些二进制数据,所以现在先讲讲怎么原生实现WebSocket连接
1.客户端(浏览器)
客户端的代码极其简单:
let ws = new WebSocket('ws://localhost:8080/'); ws.onopen = function(){ alert('连接开始啦!'); ws.send('hahahaha'); } ws.onmessage = function(data){ alert('有消息过来'); console.log(data); } ws.onclose = function(){ alert('连接关闭了'); } wa.onerror = function(){ alert('连接出错了'); }
2.服务器端(node)
const net = require('net'); const crypto = require('crypto'); const server = net.createServer(socket=>{ socket.once('data',data=>{ //第一次接收客户端请求,首先要验证是否请求更换协议,因此我们要先将data(HTTP头部信息)转成json格式,方便查询 let temp = data.toString().split(' '); let Header = {}; temp.forEach(item=> let [name, key] = item.split(': '); Header[name] = key; } //验明是否更换websocket协议(Upgrade头是表示更换到什么协议,Connection头是现在连接状态是什么) if(Header.Upgrade!='websocket'||Header.Connection!='Upgrade'){ //表示将要Upgrade到websocket协议,connection状态是'Upgrade'(实时更新的) socket.end(); } //验明是否为预期版本 else if(Header['Sec-WebSocket-Version']!='13'){ socket.end(); } //通过验证后,最后返回WebSocket-Accept(WebSocket-Key+指定guid) else{ const hash = crypto.createHash('sha1'); hash.update(Header['Sec-WebSocket-Key']+'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'); let base64Str = hash.digest('base64'); socket.write(`HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: ${base64Str} `); } //第二次以后on data走下面的函数 socket.on('data',data=>{ //data是二进制数,用原生js处理起来特别恶心 }) }); socket.on('end',()=>{ console.log('连接断开了~'); }) });
server.listen(8088);
二、socket.io
node有一个库叫socket.io,用WebSocket非常方便,特别体验在服务器端
客户端:
1.先引用路径下的socket.io/socket.io.js
2.连接,获取socket接口对象:let sock = io.connect('ws://~~~')
3.接下来就是使用sock了(sock.emit('事件名字',data);sock.on('事件名字',data=>{用data来干点什么}))
<script type="text/javascript" src="http://localhost:8088/socket.io/socket.io.js"></script> <script> window.onload = function(){ let sock = io.connect('ws://localhost:8088/'); sock.emit('test01','xiaomiemie'); sock.on('test02',(data1)=>{ document.body.innerHTML += data1; }) } </script>
简单的来说,就是 调用库(socket.io.js)->用io连接,获取socket接口对象->使用socket接口对象(emit和on)
服务器端:
const http = require('http'); const io = require('socket.io'); //先按照正常的套路写 const server = http.createServer(); server.listen(8088); //io出场,封装httpServer成为WebSocket Server const wsServer = io.listen(server); //当wsServer connection的时候 wsServer.on('connection',sock=>{ //sock就是相当于客户端io.connect('ws://~~~')返回的sock对象一样了 //(sock.emit('事件名字',data);sock.on('事件名字',data=>{用data来干点什么})) sock.emit('test02','hahaha'); sock.on('test01',data=>{ console.log(data) }) })
简单的来说,就是 调用库(require('socket.io'))->用io封装httpServer,获取WSServer->连接,获取socket接口对象->使用socket接口对象(emit和on)