NodeJs—06—socket


 

 一、websocket协议

 

 http协议没有办法让服务器发送消息给客户端,所以引入了websocket协议;

如果使用ajax轮询的方式,客户端需要不停的发送请求到服务端,每次都要新建一个连接(每次连接都要三次握手),会非常浪费;

而websocket只需要建立一次连接即可;

 以下是websocket的客户端方法:

 

 

 服务端有text事件、error事件、close事件;有send方法;

突然明白了很多变量都用const类型,因为js没有对象类型,只能用var、let、const表示,var是可变地址的全局作用域let是可变地址的局部作用域,
那只有const是不可变地址的局部作用域,对于对象这种来说一般都不需要改变它的地址,所以可以用const,如果要改变地址对象就用let;

 

 

 

 

 

 

 二、websocket协议

目前分为三种不同的socket实现,分别是http协议和websocket协议,由于http协议有一些不好的地方,所以我们目前浏览器和服务器的通信主要用websocket协议;

 前端浏览器只要支持h5,就支持websocket协议,所以前端html页面不需要引入任何包,直接就可以new  websocket;

 

 后端也需要通过websocket协议才能接受前端发起的请求,但是后端nodejs并不原生支持websocket,只原生支持net.socket,所以我们要引入nodejs-websocket模块,然后使用websocket协议进行通信;

const ws = require('nodejs-websocket');

const PORT = 3000;
const IP = 'localhost';
const TYPE_ENTER =0;
const TYPE_LEAVE =1;
const TYPE_MSG =2;
let count = 0;



// 创建一个服务器,当服务器监听到有连接过来时会触发一个回调函数,并传递参数形参为connect
// 前端后传输数据使用json格式字符串,,后端传递一个json对象,有三个属性,分别为
// type、msg、time
const server = ws.createServer( (connect) => {
    count++;
    connect.username = `用户${count}`;
    //1、广播某个用户进入聊天室
    broadcast({
        type:TYPE_ENTER,
        msg: `${connect.username}进来啦`,
        time:new Date().toLocaleTimeString(),
    });
    //2、广播某个用户说的话
    connect.on('text',(str) => {
            //广播消息给其他连接
            broadcast({
                type:TYPE_MSG,
                msg:`${connect.username}说:${str}`,
                time: new Date().toLocaleTimeString(),
            });
    })

    //3、广播某个用户退出聊天室
    connect.on('close',() => {
        //count--;
        broadcast({
            type:TYPE_LEAVE,
            msg:`${connect.username}退出了聊天室`,
            time: new Date().toLocaleTimeString(),
        });
    })

    //4、出错时触发
    connect.on('error',() => {
        console.log("error!!!");
    })

});



server.listen(PORT,IP,() => {
    console.log('服务器启动成功,开始监听');
})


function broadcast(msg) {
    server.connections.forEach(connections => {
        connections.sendText(JSON.stringify(msg));
    });
}

 

 

 

三、socket.io框架

socketio是一个框架,可以更简单的实现websocket的代码;

想要接收数据,就监听一个事件,使用on方法;

想要发送数据,就触发事件,使用emit方法;

对浏览器和服务器都是这样的;

 

 

1、Socket.IO 是什么

Socket.IO是一个库,基于 Node.js 的实时应用程序框架。可以在浏览器和服务器之间实现实时,双向和基于事件的通信。它适用于每个平台、浏览器或设备,同样注重可靠性和速度。它包括:

Node.js 服务器浏览器的Javascript客户端库(也可以从Node.js运行)

2、起源

WebSocket 的产生源于 Web 开发中日益增长的实时通信需求,对比基于 http 的轮询方式,它大大节省了网络带宽,同时也降低了服务器的性能消耗。

WebSocket 协议在2008年诞生,2011年成为国际标准。虽然主流浏览器都已经支持,但仍然可能有不兼容的情况,为了兼容所有浏览器,就诞生SocketIO。

SocketIO将WebSocket、AJAX和其它的通信方式全部封装成了统一的通信接口,也就是说,我们在使用SocketIO时,不用担心兼容问题,底层会自动选用最佳的通信方式。

3、Socket.io有什么特点

易用性:Socket.io封装了服务端和客户端,使用起来非常简单方便。跨平台:Socket.io是跨平台的,可以实现多平台的即时通讯,Socket.io支持跨平台,这就意味着你有了更多的选择,可以在自己喜欢的平台下开发实时应用。由于 iOS 端进行 socket 编程主要使用 GCDAsyncSocket 框架,但要实现 Android、iOS、web 多平台的通讯,还是选择统一的框架或协议比较好。自适应:Socket.io 实现了实时双向的基于事件的通讯机制,是基于 webSocket 的封装,但它不仅仅包括 webSocket,还对轮询(Polling)机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码,它会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化,而且支持的浏览器最低达IE5.5。五、Socket.io安装

首先要安装Node.js,然后再用如下命名安装Socket.io

npm install socket.io

 

 

4、

socket.emit()给某个用户发送消息

io.emit()广播,给所有用户发送消息

 

 

 

参考:https://baijiahao.baidu.com/s?id=1687288407113009630&wfr=spider&for=pc

 

posted @ 2021-08-09 13:29  Eric-Shen  阅读(546)  评论(0编辑  收藏  举报