websocket通信,基于nodejs的双向通信例子
发布于 作者:苏南大叔 来源:程序如此灵动~![](/usr/themes/panda/assets/img/icon/ok.png)
websocket
通信,是一个可以在浏览器里面使用的双向通信的技术。相比较传统的ajax
的轮询类型的通信方式,websocket
显然更加节约资源,它一般用作聊天类的需要消息推送的程序中。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10
,nodejs@20.18.0
,ws@8.18.0
。websocket
通信的服务器端,很多高级编程语言都可以实现。在本文中,采用更容易接受的nodejs
编程语言来阐释这个例子,后续再补充其它编程语言的例子。
websocket
WebSocket
是一种长连接技术。WebSocket
通过单个TCP
连接持续传输数据,实现了客户端和服务器之间的持久连接。与传统的HTTP
短连接不同,WebSocket
在建立连接后,可以保持连接状态,并在需要时进行数据传输,无需每次传输都重新建立连接。
服务器端
主要的逻辑,还是收发实时消息。需要先安装ws
这个第三方库。
npm i ws --save
服务器端,
let WebSocket = require("ws");
let server = new WebSocket.Server({ port: 8080 });
server.on("connection", function connection(ws) {
ws.on("message", (msg) => {
let message = msg.toString(); // buffer
console.log("服务器端收到消息", message);
if (message == "苏南") {
ws.send("大叔");
} else if (message == "ping") {
ws.send("pong");
}
});
});
客户端
客户端一般为浏览器网页代码,主要实现的是收发消息。
<script>
let ws = new WebSocket("ws://localhost:8080");
ws.onopen = function () {
ws.send("苏南");
};
ws.onclose = () => {
console.log("服务器断开链接");
};
ws.onerror = () => {
console.log("有错误发生");
};
ws.onmessage = function (e) {
let msg = e.data;
console.log("客户端收到消息:%s", msg);
if (msg === "pong") {
console.log("Heartbeat received");
}
};
let heartbeatInterval = setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
ws.send("ping");
} else {
clearInterval(heartbeatInterval);
}
}, 3000);
</script>
on('message')和onmessage()
浏览器端的写法是.onmessage(()=>{})
,服务器端的写法是.on('message',()=>{})
,两者不能互换。会发生错误或者不生效!
心跳机制
心跳机制实际上就是客户端定时发送消息,服务器端收到消息后,实时回复特定消息。从而确定彼此的存在,如果一定时间内没有得到期待中的回应,则可以认为心跳检测失败。
虽然最基础的心跳机制就是这样写的,但是对于websocket
来说,这个心跳写的并不是很好,待后续补充。这里就仅仅作为服务器和客户端收发消息的一个例子好了。
结语
websocket
协议,里面包括:ws
和wss
,类似于http
和https
的关系。本文未包含wss
,待议。更多websocket
相关文章,请参考:
![](/usr/themes/panda/assets/img/icon/end.gif)
![](/usr/themes/panda/assets/img/icon/ok.png)
![](/usr/themes/panda/assets/img/icon/stop.png)