WebSocket

一、原生

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)

原文地址:https://www.cnblogs.com/amiezhang/p/7929416.html