爱智EdgerOS之深入解析在爱智应用中如何使用Socket.IO轻松实现双向通信

news2025/1/16 5:43:45

一、什么是 Socket.IO?

  • Socket.IO 是一个基于事件通信的实时应用程序框架,它在即时通讯、通知和消息推送,实时分析等场景中有广泛的应用。
  • Socket.IO 包括两个部分:
    • 在 Server 端的模块(JSRE 已提供了 socket.io 模块);
    • 在 Client 端的模块。
  • Socket.IO 将实现分成了两层:
    • 底层管道:即 Engine.IO 层,它是 Socket.IO 的内部引擎。
    • 高级 API:即 Sokcet.IO 本身。
  • Engine.IO 负责建立服务器和客户端之间的低级连接,它的主要任务是处理各种传输和升级机制以及断线检测重连。客户端首先会尝试通过 WebSocket 进行连接,如果失败则会回退到 HTTP 进行长轮询。所以,理想情况下应该保证:
    • 浏览器是支持 WebSocket 的;
    • 没有任何元素(代理、防火墙等)阻止客户端和服务器之间的 WebSocket 连接。
  • 当连接建立完成之后,高层就可以通过暴露出来的 API 进行数据交换。

二、高层API

  • Socket.IO 是基于事件的,实际上就是对 EventEmitter 类的继承,在 EventEmitter 中,对象(发射器)发出命名事件,导致函数对象(侦听器)被调用。基于事件驱动,需要通过 on 方法向侦听器中添加事件名以及监听函数,通过 emit 来触发监听函数,从而完成通信任务。
  • Socket.IO 实现了 EventEmitter 中的事件触发以及监听函数,包括基本的 on(), emit(), removeListener() 等,同时也自定义了一些针对连接生命周期内的事件名,包括:
    • connect 来自客户端连接时触发;
    • connection 是 connect 的别名;
    • disconnect 断开连接时触发;
    • disconnecting 当客户端将要断开连接(还未离开 rooms)时触发;
    • error 发生错误时触发。
  • 这些是 Socket.IO 的保留字段(还有 newListener,removeListener),在自定义的时候应该避免和这些字段重名。

三、JSRE 中的引用

  • JSRE 中提供了 Socket.IO 的模块,在服务端可以直接使用,需要注意的是当前 JSRE 中 Socket.IO 的版本为 2.x,前端在使用 Socket.IO 的模块时需要注意版本对应。
  • 那么 Socket.IO 是如何运行的呢?

四、Server 端的创建

  • 如下所示,是 Server 端的示例代码:
/* Import system modules */
const WebApp = require('webapp');
const io = require('socket.io');

/* Import routers */
const myRouter = require('./routers/rest');

/* Create App */
const app = WebApp.createApp();

/* Set static path */
app.use(WebApp.static('./public'));

/* Set test rest */
app.use('/api', myRouter);

/* Rend test */
app.get('/temp.html', function(req, res) {
  res.render('temp', { time: Date.now() });
});

/* Start App */
app.start();

const socketio = io(app, {
  serveClient: false,
  pingInterval: 10000,
  pingTimeout: 5000
})

socketio.on('connection', socket => {
  console.log('>> socket connected <<')
  socket.emit('falcon', 'reply please')

  socket.on('message', (data, ack) => {
    console.log('recive:', data)
    ack('0')
  })

  socket.on('message2', data => {
    console.log('recive:', data)
  })
})


/* Event loop */
require('iosched').forever();
  • 可以看到,创建 Socket.IO 的 server 还是很简单的,只需要将 webapp 的实例作为参数传递进去,然后监听 connection 方法。emit 会发射消息,消息内容可以根据自己的需求定义,可以是简单的字符串,也可以是一个结构化的 JSON 对象。
  • 在 socket.on 中定义监听消息字段,如上示例,我们可以仅仅接收数据,进行处理,也可以给出 ack 返回确认信息。socket.emit 同样支持 response 的返回函数,以做出确认响应。
socket.emit('ferret', 'tobi', (data) => {
  console.log(data); // data will be 'woot'
});

// client code example
client.on('ferret', (name, fn) => {
  fn('woot');
});

五、Client 端的创建

  • 接下来看一下前端应用如何使用使用 Socket.IO 与服务端的建立连接并通信,以 Vue3 为例,使用 socket.io-client 包:
npm install socket.io-client
# or use yarn 
yarn add socket.io-client
  • 为了方便在不同的页面进行调用,可以将 socket.io 进行一次封装,以下仅作为参考:
// src/libs/socketio.js
import io from 'socket.io-client'
class SocketIO {
  constructor () {
    this.socket = io('https://192.168.128.1:7369')
    this.socket.on('connect', () => {
      // 连接上服务端的回调函数
      // 还可以监听 'error' 并对错误连接进行相应处理
      console.log('>> 已连接!')
    })
  }

  push (event, msg) {
    // 这里封装了一个通用 response 的 emit 方法用以处理相同确认操作的 emit
    this.socket.emit(event, msg, (response) => {
      console.log('>>>> res:', response)
    })
  }
}

export const socketio = new SocketIO()

六、客户端连接生命周期

  • 生命周期示意图:

在这里插入图片描述

  • 接下来在不同的页面就可以引用这个封装来进行简单操作:
// src/App.jsx
import { defineComponent, onMounted } from 'vue'
import './app.less' // css 设置白色背景及安全距离
// 上文中导出的 socketio
import { socketio } from './libs/socketio'

export default defineComponent({
  name: 'APP',
  setup (props, ctx) {
    //
    onMounted(() => {
      // 如果此页面需要监听后端发送数据
      // 最好将监听函数在 onMounted 生命周期中创建出来
      socketio.socket.on('message', data => {
        console.info('>> client recive:', data)
      })
    })

    // 发送数据的函数
    function handleEmitMsg () {
      socketio.push('message', 'gg')
    }
    return () => (
      <div>
        <p><button onClick={ handleEmitMsg }>emit</button></p>
      </div>
    )
  }
})
  • 以上就是前端监听消息,以及发送消息的操作,如果此时想对特定操作执行 emit 消息返回确认,可以从实例中获取:
// 修改上例中的 emit 函数
// 发送数据的函数
function handleEmitMsg () {
  socketio.socket.emit('message', 'data', response => {
    // 逻辑代码
  })
}
  • 至此已经完整走完 Socket.IO 的建立过程,理解的点就在于需要知道 socket 是一个基于事件双向通信的过程,两端都可以进行主动消息的发送以及被动消息的接收,所以需要事先约定好一个消息名称,作为消息发送方,需要 emit 发送这个消息;作为消息接收方,需要 on 接收这个消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Onnx 转Ncnn

Onnx 转Ncnn 算法工程师给了onnx,需要转成ncnn才能用到安卓上去&#xff0c;步骤如下 简化onnx 算法给了.onnx后缀的文件&#xff0c;100多兆&#xff0c;太大&#xff0c;第一步&#xff0c;先简化&#xff1a; conda env list 查看conda环境&#xff08;前提是之前已经配…

企业级实践:分布式系统中的可靠消息最终一致性方案

背景 公司由于业务爆发式增长&#xff0c;新上了许多业务系统&#xff0c;例如&#xff1a;本地生活、社区团购、旅投B2B、旅投B2C等系统&#xff1b;同时&#xff0c;由于业务系统越来越多&#xff0c;为了运营方便&#xff0c;把分销、营销、订单、会员等多个业务系统公共业…

Babel零基础教程

参考https://www.jiangruitao.com/babel/ 写的非常好&#xff0c;本人只是为了方便查找&#xff0c;记录在自己博客上&#xff0c;原文可以去该链接拜读 1、 Babel 简介 Babel是什么&#xff1f; Babel是一个工具集&#xff0c;主要用于将ES6版本的JavaScript代码转为ES5等向…

遗传算法的概念和python实现

遗传算法是一个非常经典的智能算法&#xff0c;主要用于解决优化问题。本文主要简单介绍一些原理&#xff0c;同时给出一个基于python实现的&#xff0c;用于解决实数内优化问题的模板。 本文参考&#xff1a; 原理&#xff1a;遗传算法入门详解 - 知乎 简单介绍 遗传算法就…

服务型企业如何使用飞项实现项目化管理?

服务型企业的业务模式一般都是按项目来运作的&#xff0c;其业务分为售前&#xff0c;售中和售后三个阶段&#xff0c;分别由不同部门和人员对客户进行个性化服务。在这个过程中需要对人、流程和知识的高效统筹管理&#xff0c;即项目的整体管理&#xff0c;因此存在着不小的挑…

Nvidia Jetson Orin: SPE/AON Cortex-R5 固件开发

Nvidia Jetson Orin: SPE/AON Cortex-R5 固件开发 写在最前边开发/下载 SPE 固件关于修改DTS 写在最前边 SPE 只能控制 AON GPIO 最多32个PIN 开发/下载 SPE 固件 S1&#xff1a;打开 https://developer.nvidia.com/embedded/jetson-linux S2&#xff1a;这里下载 S3&#x…

Linux环境使用日志切割工具-cronolog

Linux环境使用日志切割工具 需明白的点&#xff1a;1.安装 2.如何使用 一、安装cronolog 1.首先检查是否存在cronolog 命令&#xff1a;whereis cronolog 或 which cronolog 2.不存在则安装 安装方式&#xff1a; a.yum 安装&#xff1a;yum install cronolog b. 源码安装&am…

C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-数组-学习笔记(10)

参考&#xff1a;麦子学院-嵌入式C语言高级-内存空间 2-3 : C语言内存空间的使用-数组 内存分配的一种形式 数组的定义及初始化 定义一个空间: 1、大小 2、读取方式 数组名[]:升级为连续空间的名称&#xff0c; [m]的作用域只在申请的时候起作用 每个多大&#xff1f;数组…

太给力了,这款java表单设计器可提高办公协作效率!

随着办公自动化的快速发展&#xff0c;java表单设计器的应用价值和突出优势也逐渐成为企业提高办公效率的好帮手。传统的表单操作起来费时费力&#xff0c;效率不高&#xff0c;逐渐满足不了日益繁多的业务需求了&#xff0c;在广大用户的呼声和市场发展下&#xff0c;简洁、灵…

ESP32学习五-启动流程

一、简介 在ESP32的开发中&#xff0c;通常我们会从app_main函数中开始我们的代码开发。但是为什么是app_main呢&#xff1f;app_main又是从哪里被调用的&#xff1f;app_main之前又做了什么操作呢&#xff1f;今天我们就来详细分析一下。 官方参考文档&#xff1a;应用程序的启…

柔性作业车间生产调度中MK算例文本各行数字表示的含义以及算例的数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 MK算例其他MK02~MK10柔性作业车间数据 MK算例 Brandimarte给出了10组柔性作业车间的实例分别是MK01~Mk10&#xff0c;下方即为MK01的实例数据 10 6 26 2 1…

Kubernetes Operator开发

Kubernetes Operator开发 1.kubebuilder 创建项目 2.Crontroller开发与部署 开发环境准备 kubebuilder 介绍 CRD的开发与部署 Crontroller开发与部署 Operator功能设计 借助operator完成 和企业内部注册中心打通 这里以Traefiketcd的模式为例进行演示说明 在这里etcd provi…

现在学习云计算,还有出路吗?

现在学习云计算&#xff0c;还有出路吗&#xff1f; 当然有出路&#xff0c;现在正是学习云计算的好时机。只要你专业技术过关&#xff0c;有一定的项目经验&#xff0c;有的企业甚至接受应届生&#xff1b;其次是具备一定的职业素养&#xff0c;学历在大专及以上&#xff0c;年…

潇洒郎: git配置、拉取、提交代码

git配置拉取代码 git 配置全局变量 git config --global user.name "xuxiaosa" git config --global user.email "xuxiaosamigu.cn" 配置ssh key 1、打开git-bash 输入ssh-keygen 一直回车&#xff0c;会提示文件保存的地址 id_rsa,id_rsa.pub两个文…

谷粒商城二十二订单服务支付

我们支付暂时只开发支付宝&#xff0c; 按照正规的流程&#xff0c;我们的系统要接入支付宝&#xff0c;肯定是需要大量的审核过程&#xff0c;而且需要我们的项目上线。 那现在我们就想测试该怎么办&#xff1f;支付宝为我们提供了沙箱环境&#xff0c;我们可以在应用未上线之…

易观千帆 | 2023年3月银行APP月活跃用户规模盘点

易观&#xff1a;2023年3月手机银行服务应用活跃人数53289.05万&#xff0c;环比增长2.15%&#xff0c;同比增长8.87%。 2023年3月信用卡服务应用活跃人数10800.71万&#xff0c;环比增长1.87%&#xff0c;同比增长18.64%。 2023年3月城商行手机银行服务应用活跃人数3827.43万&…

【项目篇1】一个在线OJ系统

目录 一、前言&#xff1a;项目背景 功能1&#xff1a;能够管理题目 功能2&#xff1a;可以展示题目列表 功能3&#xff1a;题目详情页 功能4&#xff1a;可以令用户提交代码&#xff0c;并验证提交的情况 注意事项&#xff1a; 功能5&#xff1a;反馈运行的结果 二、项…

不同的场景上线时钟同步系统需要注意些什么

时钟同步系统一般都是用在学校或者医院的环境当中&#xff0c;一般时钟同步系统由硬件和软件相组成。对于局域网部署&#xff0c;通常使用NTP协议。对于广域网部署&#xff0c;通常需要考虑网络延迟和安全性等因素。此外&#xff0c;时钟同步系统在不同的使用场景当中的需求也不…

Vite详解

目录 前言一、Vite简介1. Vite组成2.为什么选 Vite? 二、Vite的优缺点1.vite优点2.vite缺点 三、使用Vite创建Vue3项目1. 创建 vite 的项目2.项目的结构 前言 构建工具 Vite&#xff0c;目前只有vue3才可以使用Vite&#xff0c;如果本文对你有所帮助请三连支持博主。 一、V…

雷达人体存在感应器成品,静止存在感控方案,雷达触发联动技术应用

随着社会经济的不断发展和科技水平的不断提高&#xff0c;智能感应类产品越来越多的应用到我们生产与生活之中。 小到家里边的感应灯、单位里的自动门&#xff0c;大到安防报警等诸多领域&#xff0c;都能体验到它给我们带来的便利性与安全性。 雷达人体感应器可以精准探测人体…