美文网首页
websocket协议与socket.io使用

websocket协议与socket.io使用

作者: squidbrother | 来源:发表于2019-12-05 00:23 被阅读0次
    WebSocket通信协议

    WebSocket 是HTML5中新增加的一种在单个 TCP 连接上进行全双工通讯的协议;
    允许跨域通讯;
    是一种在客户端与服务器之间保持TCP长连接的网络协议;
    使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据;
    而无须客户端周期性的请求服务器,以动态更新数据内容。

    端口
    Websocket浏览器中,默认使用80
    在TLS之上默认使用443

    在没有websocket之前,服务器向客户端推送数据,都是模拟操作(轮询,长轮询)

    轮询
    客户端定时向服务器发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
    长轮询
    客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

    这2种传统的HTTP协议传输方式,较于WebSocket协议传输方式有那些不足呢?
    ajax定时请求服务器,浪费服务器资源、浪费带宽、很多请求是无意义的。
    虽然在长轮询中,类似于函数节流方式,降低了请求的频率,但是问题依然存在。

    应用场景

    网站客服机械人,浏览器与服务器 点对点 的信息传输
    聊天室,服务器向浏览器群发(接收到某个浏览器发送的)信息

    socket.io

    官宣:具有最快和最可靠的实时引擎
    是一款针对websocket封装的三方库,在不支持的低版本浏览器中,使用传统的轮询方式,封装了一系列API

    安装与使用
    安装 socket.io

    npm install socket.io -S
    

    建立一个websocket链接
    服务器端:

    const http = require('http');
    const fs = require('fs');
    const url = require('url');
    
    const App = http.createServer((req,res)=>{
        res.writeHead(200,{'Content-Type':'text/html;charset="utf-8"'});
        
        fs.readFile('./index.html',(err,data)=>{
            if(!err){
                res.write(data);
                res.end();
            }else{
                console.log('404');
                res.write('404');
                res.end();
            }
        })
    })
    
    const Io = require('socket.io')(App);
    Io.on('connection',function(socket){
        console('建立连接');
            //服务器发送浏览器后续的操作代码........
    }); 
    App.listen(3000);
    

    浏览器端:

    <script type="text/javascript" src="http://localhost:3000/socket.io/socket.io.js"></script>
    <script type="text/javascript">
        var socket = io.connect('http://localhost:3000');
    </script>
    

    常用指令
    发送信息:
    点对点 : 应用场景,机器人客服,智能问答

    socket.emit('健名','数据');     
    

    广播 : 应用场景,一个唯一房间的聊天室

    Io.emit('健名','数据'); 
    

    指定范围内广播 (特定范围内的广播)

    房间编号 = url.parse(socket.request.url,true).房间健名
    socket.join('房间编号');
    Io.to('房间编号').emit('健名','数据');
    

    指定房间推送实例

    相关文章

      网友评论

          本文标题:websocket协议与socket.io使用

          本文链接:https://www.haomeiwen.com/subject/wvprgctx.html