ToB企服应用市场:ToB评测及商务社交产业平台
标题:
WebSocket(WS)协议系列(二)事件机制
[打印本页]
作者:
泉缘泉
时间:
2025-2-21 00:29
标题:
WebSocket(WS)协议系列(二)事件机制
通讯两边怎么知道对方什么时候会发消息过来并吸收的,是通过轮询吗?
轮询是指客户端定期向服务器发送请求,检查是否有新的数据(即客户端不停发起请求)。
就是你的舔狗,天天定时定点发消息问你,在吗?睡了吗?看电影吗?检查你是否有想和ta语言的意愿。你语言了,就是有新的数据,ta就get到了。
WebSocket不使用传统的轮询机制,它通过
事件驱动
的方式处理消息的
吸收和发送
。而WebSocket连接在建立后是
持久的
,并且是
双向的
,意味着服务器可以主动向客户端发送数据,客户端也可以主动发送数据,两者之间的通信是即时的。
与轮询相比,WebSocket的上风在于:
低延迟: 消息在必要时即时发送,而
不必要等待周期性
的请求。
我想和你看电影,不等你周期性地来问,直接马上打电话和你说。
减少带宽消耗: 不必要不停发送请求来检查新数据。
双向通信: 两边都可以主动发送数据,而不只是客户端向服务器请求。
我们两个的交换有来有往,不是一方在主导。你想和我看电影,也可以直接马上打电话说。
什么是事件机制?
事件机制是一种
编程模子
,通常用于处理
异步事件
。在这种模子中,程序不会一直轮询或等待某个任务的完成,而是当某个事件发生时,体系会
主动触发特定的处理函数
(通常被称为回调函数)来相应这个事件。
WebSocket如何实现事件机制?
WebSocket实现事件机制的核心就是基于
回调函数
和
事件监听器
。在JavaScript等语言中,WebSocket对象通过定义一些内置的事件和回调函数来处理这些事件。
WebSocket的事件机制包罗以下常见事件:
onopen(连接打开事件): 这个事件在WebSocket连接成功建立时触发。通常你会在这个事件里写一些初始化代码。
onmessage(消息吸收事件): 这个事件在从服务器吸收到数据时触发。它的回调函数会收到一个包罗服务器发送消息的事件对象。
onclose(连接关闭事件): 当WebSocket连接关闭时,onclose事件被触发。这个事件常用于处理连接断开后的逻辑,比如重新连接或者清算资源。
onerror(错误事件): 如果WebSocket连接发生错误,这个事件会被触发。它通常用于处理错误规复或记载日志等操作。
// 创建WebSocket对象
const socket = new WebSocket('ws://example.com/socket');
// 监听连接打开事件
socket.onopen = function(event) {
console.log("WebSocket连接已建立");
// 连接成功后可以开始发送消息
socket.send("Hello Server!");
};
// 监听消息接收事件
socket.onmessage = function(event) {
console.log("收到来自服务器的消息: " + event.data);
};
// 监听连接关闭事件
socket.onclose = function(event) {
console.log("WebSocket连接已关闭");
};
// 监听错误事件
socket.onerror = function(event) {
console.log("WebSocket发生错误");
};
复制代码
socket.onopen、socket.onmessage、socket.onclose 和 socket.onerror 都是事件处理函数(也叫回调函数)。这些函数会在对应事件发生时主动被调用。
回调函数的参数:事件回调函数通常会吸收一个事件对象作为参数,例如onmessage事件吸收到的event对象包罗了消息内容(如event.data)。
例子:
WebSocket 服务器代码
// 引入ws库
const WebSocket = require('ws');
// 创建一个WebSocket服务器,监听在8080端口
const wss = new WebSocket.Server({ port: 8080 });
// 当有客户端连接时,触发 'connection' 事件
wss.on('connection', (ws) => {
console.log('一个客户端已连接');
// 监听客户端发送过来的消息
ws.on('message', (message) => {
console.log('收到客户端消息: %s', message);
// 发送响应给客户端
ws.send('服务器收到消息: ' + message);
});
// 监听客户端断开连接的事件
ws.on('close', () => {
console.log('客户端已断开连接');
});
// 监听发生错误的事件
ws.on('error', (err) => {
console.log('发生错误: ', err);
});
// 向客户端发送欢迎消息
ws.send('欢迎连接到WebSocket服务器!');
});
console.log('WebSocket服务器已经启动,监听端口 8080');
复制代码
连接到 WebSocket 服务器(客户端代码)
// 创建 WebSocket 连接
const socket = new WebSocket('ws://localhost:8080');
// 监听连接成功事件
socket.onopen = function() {
console.log('成功连接到服务器');
// 向服务器发送消息
socket.send('Hello, server!');
};
// 监听接收到的消息
socket.onmessage = function(event) {
console.log('收到来自服务器的消息:', event.data);
};
// 监听连接关闭事件
socket.onclose = function() {
console.log('连接已关闭');
};
// 监听错误事件
socket.onerror = function(error) {
console.error('WebSocket 发生错误:', error);
};
复制代码
客户端得到的结果应该是:
客户端连接到 WebSocket 服务器。
客户端向服务器发送消息 “Hello, server!”。
服务器吸收到消息并相应 “服务器收到消息: Hello, server!”。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4