websocket协议与socket.io使用

2019-12-05  本文已影响0人  squidbrother
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('健名','数据');

指定房间推送实例

上一篇下一篇

猜你喜欢

热点阅读