WebSocket(WS)协议系列(二)事件机制

打印 上一主题 下一主题

主题 866|帖子 866|积分 2608

通讯两边怎么知道对方什么时候会发消息过来并吸收的,是通过轮询吗?

轮询是指客户端定期向服务器发送请求,检查是否有新的数据(即客户端不停发起请求)。
   就是你的舔狗,天天定时定点发消息问你,在吗?睡了吗?看电影吗?检查你是否有想和ta语言的意愿。你语言了,就是有新的数据,ta就get到了。
  WebSocket不使用传统的轮询机制,它通过事件驱动的方式处理消息的吸收和发送。而WebSocket连接在建立后是持久的,并且是双向的,意味着服务器可以主动向客户端发送数据,客户端也可以主动发送数据,两者之间的通信是即时的。
与轮询相比,WebSocket的上风在于:
低延迟: 消息在必要时即时发送,而不必要等待周期性的请求。
   我想和你看电影,不等你周期性地来问,直接马上打电话和你说。
  减少带宽消耗: 不必要不停发送请求来检查新数据。
双向通信: 两边都可以主动发送数据,而不只是客户端向服务器请求。
   我们两个的交换有来有往,不是一方在主导。你想和我看电影,也可以直接马上打电话说。
  什么是事件机制?

事件机制是一种编程模子,通常用于处理异步事件。在这种模子中,程序不会一直轮询或等待某个任务的完成,而是当某个事件发生时,体系会主动触发特定的处理函数(通常被称为回调函数)来相应这个事件。
WebSocket如何实现事件机制?

WebSocket实现事件机制的核心就是基于回调函数事件监听器。在JavaScript等语言中,WebSocket对象通过定义一些内置的事件和回调函数来处理这些事件。
WebSocket的事件机制包罗以下常见事件:
onopen(连接打开事件): 这个事件在WebSocket连接成功建立时触发。通常你会在这个事件里写一些初始化代码。
onmessage(消息吸收事件): 这个事件在从服务器吸收到数据时触发。它的回调函数会收到一个包罗服务器发送消息的事件对象。
onclose(连接关闭事件): 当WebSocket连接关闭时,onclose事件被触发。这个事件常用于处理连接断开后的逻辑,比如重新连接或者清算资源。
onerror(错误事件): 如果WebSocket连接发生错误,这个事件会被触发。它通常用于处理错误规复或记载日志等操作。
  1. // 创建WebSocket对象
  2. const socket = new WebSocket('ws://example.com/socket');
  3. // 监听连接打开事件
  4. socket.onopen = function(event) {
  5.     console.log("WebSocket连接已建立");
  6.     // 连接成功后可以开始发送消息
  7.     socket.send("Hello Server!");
  8. };
  9. // 监听消息接收事件
  10. socket.onmessage = function(event) {
  11.     console.log("收到来自服务器的消息: " + event.data);
  12. };
  13. // 监听连接关闭事件
  14. socket.onclose = function(event) {
  15.     console.log("WebSocket连接已关闭");
  16. };
  17. // 监听错误事件
  18. socket.onerror = function(event) {
  19.     console.log("WebSocket发生错误");
  20. };
复制代码
socket.onopen、socket.onmessage、socket.onclose 和 socket.onerror 都是事件处理函数(也叫回调函数)。这些函数会在对应事件发生时主动被调用。
回调函数的参数:事件回调函数通常会吸收一个事件对象作为参数,例如onmessage事件吸收到的event对象包罗了消息内容(如event.data)。
例子:

WebSocket 服务器代码
  1. // 引入ws库
  2. const WebSocket = require('ws');
  3. // 创建一个WebSocket服务器,监听在8080端口
  4. const wss = new WebSocket.Server({ port: 8080 });
  5. // 当有客户端连接时,触发 'connection' 事件
  6. wss.on('connection', (ws) => {
  7.     console.log('一个客户端已连接');
  8.    
  9.     // 监听客户端发送过来的消息
  10.     ws.on('message', (message) => {
  11.         console.log('收到客户端消息: %s', message);
  12.         // 发送响应给客户端
  13.         ws.send('服务器收到消息: ' + message);
  14.     });
  15.     // 监听客户端断开连接的事件
  16.     ws.on('close', () => {
  17.         console.log('客户端已断开连接');
  18.     });
  19.     // 监听发生错误的事件
  20.     ws.on('error', (err) => {
  21.         console.log('发生错误: ', err);
  22.     });
  23.     // 向客户端发送欢迎消息
  24.     ws.send('欢迎连接到WebSocket服务器!');
  25. });
  26. console.log('WebSocket服务器已经启动,监听端口 8080');
复制代码
连接到 WebSocket 服务器(客户端代码)
  1. // 创建 WebSocket 连接
  2. const socket = new WebSocket('ws://localhost:8080');
  3. // 监听连接成功事件
  4. socket.onopen = function() {
  5.     console.log('成功连接到服务器');
  6.     // 向服务器发送消息
  7.     socket.send('Hello, server!');
  8. };
  9. // 监听接收到的消息
  10. socket.onmessage = function(event) {
  11.     console.log('收到来自服务器的消息:', event.data);
  12. };
  13. // 监听连接关闭事件
  14. socket.onclose = function() {
  15.     console.log('连接已关闭');
  16. };
  17. // 监听错误事件
  18. socket.onerror = function(error) {
  19.     console.error('WebSocket 发生错误:', error);
  20. };
复制代码
客户端得到的结果应该是:
客户端连接到 WebSocket 服务器。
客户端向服务器发送消息 “Hello, server!”。
服务器吸收到消息并相应 “服务器收到消息: Hello, server!”。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表