zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    boost::asio在VS2008下的编译错误
    Java集合框架——接口
    ACM POJ 3981 字符串替换(简单题)
    ACM HDU 1042 N!(高精度计算阶乘)
    OneTwoThree (Uva)
    ACM POJ 3979 分数加减法(水题)
    ACM HDU 4004 The Frog's Games(2011ACM大连赛区第四题)
    Hexadecimal View (2011ACM亚洲大连赛区现场赛D题)
    ACM HDU 4002 Find the maximum(2011年大连赛区网络赛第二题)
    ACM HDU 4001 To Miss Our Children Time (2011ACM大连赛区网络赛)
  • 原文地址:https://www.cnblogs.com/amiezhang/p/7929416.html
Copyright © 2011-2022 走看看