当前位置: 首页 > news >正文

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!”。

相关文章:

  • 防泄密软件可以管理电脑的使用,还能防止数据泄漏... 原创
  • 使用Catcho阻止app闪退
  • Docker 在微服务架构中的应用(一)
  • HTML5 面试题
  • 程序员学英文之At the Hotel
  • Redis存储⑨Redis的持久化_RDB和AOF
  • 二、《重学设计模式》-UML类图
  • 在虚拟机中搭建Spark学习环境的完整指南
  • priority_queue创建堆
  • Vue3.5 企业级管理系统实战(七):Sidebar组件开发 1
  • 1-18 GIT设置公钥
  • 容器docker k8s相关的问题汇总及排错
  • 高并发系统架构设计全链路指南
  • Vue学习记录20
  • mac os设置jdk版本
  • 电脑网络图标消失了怎么办?(Windows电脑网络或WiFi图标消失,如何找回?)
  • Vue3 前端路由配置 + .NET8 后端静态文件服务优化策略
  • 蓝桥杯备考:贪心算法之排座位
  • 字符设备驱动
  • 2024华为OD机试真题-第k个排列(C++/Java/Python)-E卷-100分
  • 南京江宁区市监局通报:盒马一批次猕猴桃检出膨大剂超标
  • 现场丨在胡适施蛰存等手札与文献间,再看百年光华
  • 中国—美国经贸合作对接交流会在华盛顿成功举行
  • 西班牙政府排除因国家电网遭攻击导致大停电的可能
  • 车载抬头显示爆发在即?业内:凭借市场和产业链优势,国内供应商实现反超
  • “一码难求”的Manus开放注册但价格不菲,智能体距离“实用”还有多远