• 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)

  • 相关阅读:
    systabcontrol32
    winform 进程唯一,打开第二个激活第一个进程的窗体显示
    winform在 Xp下杀死进程
    安装包创建桌面快捷方式
    [最短路/线段树大法优化DIJ] 【模板】单源最短路径(标准版)
    [线段树模板题] 线段树2
    [线段树优化应用] 数星星Star
    [倍增思想/变种最短路] 跑路
    [DP/变种背包] SOFTWARE
    [前缀和/数论] 数列
  • 原文地址:https://www.cnblogs.com/amiezhang/p/7929416.html
Copyright © 2020-2023  润新知