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

一、什么是 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 接收这个消息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

密码和生物识别技术可以阻止不良行为者

网络安全漏洞是一个持续的威胁&#xff0c;而且只会越来越严重。2021 年&#xff0c;45% 的美国公司遭受了与凭证泄露相关的数据泄露&#xff0c;4200 万人因身份盗用和相关欺诈遭受了超过 500 亿美元的总价值损失&#xff0c;并且在过去五年中&#xff0c;超过5 亿个凭证和密码…

AI绘画王炸功能Control Net安装教程

原文&#xff1a;AI绘画王炸功能Control Net安装教程 - 知乎 AI绘画&#xff0c;最近两大王炸功能出圈了。 一个就是超真实超细节的美女图片&#xff0c;已经快和照片无异了&#xff0c;甚至有人用AI绘画的“女仆照片”开始招募游艇会了&#xff0c;具体教程可以查看Lora这篇…

多元时间序列 | GRU门控循环单元多变量时间序列预测(Matlab完整程序)

多元时间序列 | GRU门控循环单元多变量时间序列预测(Matlab完整程序) 目录 多元时间序列 | GRU门控循环单元多变量时间序列预测(Matlab完整程序)预测结果评价指标基本介绍程序设计参考资料预测结果 评价指标 训练集数据的R2为:0.98197 测试集数据的R2为:0.97913 训练集数…

Nacos配置管理

Nacos配置管理1 Nacos配置管理1.1 统一配置管理1.1.1 在nacos中添加配置文件1.1.2 从微服务拉取配置1.2 配置热更新1.2.1 方式一1.2.2 方式二1.3 配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09;运行两个UserApplication&am…

Minikube安装、运行

1.Minikube是什么 本地的k8s集群&#xff0c;方便开发者学习k8s。 2.安装的前提条件 2个CPU货以上。2G内存或以上。20G磁盘或以上。可以链接互联网。安装docker&#xff08;官网说或者一个虚拟环境&#xff0c;这个不考虑&#xff09;。 3.官网地址 minikube start | minik…

进程状态初始

目录 &#xff1a; 1.状态的认识 2.具体状态的学习 3.验证 R S T Z&#xff08;引出孤儿进程&#xff09;状态 4.前台、后台运行程序 -------------------------------------------------------------------------------------------------------------- 1.状态的认识 进程…

前列腺癌论文笔记

名词解释 MRF: 磁共振指纹打印技术( MR Fingerprinting)是近几年发展起来的最新磁共振技术&#xff0c;以一种全新的方法对数据进行采集、后处理和实现可视化。 MRF使用一种伪随机采集方法&#xff0c;取代了过去为获得个体感兴趣的参数特征而使用重复系列数据的采集方法&…

python零基础实现基于旋转特征的自监督学习(二)——在resnet18模型下应用自监督学习

系列文章目录 基于旋转特征的自监督学习&#xff08;一&#xff09;——算法思路解析以及数据集读取 基于旋转特征的自监督学习&#xff08;二&#xff09;——在resnet18模型下应用自监督学习 模型搭建与训练系列文章目录前言resNet18Residualresnet_blockresNet18select_mod…

apache配置与应用

构建虚拟 Web 主机 apache虚拟web主机指在同一台服务器运行多个web站点&#xff0c;其中每一个站点实际上并不独立占用整个服务器&#xff0c;因此被称为web主机&#xff0c;可以充分利用服务器的硬件资源&#xff0c;大大降低网站的构建成本 http服务支持三种虚拟主机类型 …

Spring Cloud之Consul服务治理实战

目录 1、Consul是什么 1.1概念 1.2 Consul下载 1.3 Consul启动 2、Consul使用场景 3、Consul优势 4、Consul架构及原理 4.1 整体架构图 4.2 通讯机制 4.3 健康检测 4.4如何保证数据一致性 5、搭建Consul环境 5.1 本地Consul搭建 5.2 集群Consul搭建 5.2.1 安装C…

VUE使用el-ui的form表单输入框批量搜索<VUE专栏三>

针对form表单的输入框单号批量查询&#xff0c;这里用换行符进行分割&#xff0c;注意v-model不要使用.trim 前端代码&#xff1a; <el-form-item label"SKU编码:" prop"prodNumbers"><el-input type"textarea" :rows"4" pla…

Spring 之依赖注入底层原理

Spring 框架作为 Java 开发中最流行的框架之一&#xff0c;其核心特性之一就是依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;。在Spring中&#xff0c;依赖注入是通过 IOC 容器&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;来实现…

电动牙刷语音芯片,音乐播放ic选型?

牙医认为每天刷牙两次对于口腔健康至关重要。但是有些人会因为不良的刷牙习惯而受害&#xff0c;比如刷牙时间不够长。而刷牙不当会导致牙齿出现问题&#xff0c;例如蛀牙、污渍和口臭。 为了保护牙齿健康&#xff0c;很多家庭开始尝试使用电动牙刷。电动牙刷通过嗡嗡地振动消…

springboot2.7及springboot3中自动配置的变化

大家在面试中问到springboot如何实现的自动配置 诶&#xff0c;不要傻背错八股了&#xff0c;以往 入口类上的SpringBootApplication注解引入EnableAutoConfiguration&#xff0c;再 Import({AutoConfigurationImportSelector.class}) &#xff0c;其中代码实现根据META-INF/sp…

实战案例|聚焦攻击面管理,腾讯安全威胁情报守护头部券商资产安全

金融“活水”润泽千行百业&#xff0c;对金融客户来说&#xff0c;由于业务场景存在特殊性和复杂性&#xff0c;网络安全必然是一场“持久战”。如何在事前做好安全部署&#xff0c;构建威胁情报分析的防护体系至为重要&#xff0c;实现更为精准、高效的动态防御。 客户名片 …

Java实现打印杨辉三角形,向左、右偏的平行四边形这三个图形代码程序

目录 前言 一、打印杨辉三角形 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 二、向左偏的平行四边形 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 三、向右偏的平行四边形 1.1运行流程&#xff08;思想&#xff09; 1.2代…

一个评测模型+10个问题,摸清盘古、通义千问、文心一言、ChatGPT的“家底”!...

‍数据智能产业创新服务媒体——聚焦数智 改变商业毫无疑问&#xff0c;全球已经在进行大模型的军备竞赛了&#xff0c;“有头有脸”的科技巨头都不会缺席。昨天阿里巴巴内测了通义千问&#xff0c;今天华为公布了盘古大模型的最新进展。不久前百度公布了文心一言、360也公布了…

网络系统集成综合实验(六)| 访问控制列表ACL配置

目录 一、前言 二、实验目的 三、实验需求 四、实验步骤与现象 &#xff08;一&#xff09;基本ACL实验 Step1&#xff1a;构建拓扑图如下&#xff1a; Step2&#xff1a;PC的IP地址分别配置如下&#xff1a; Step3&#xff1a;路由器的IP地址配置如下 Step4&#xff…

十、CNN卷积神经网络实战

一、确定输入样本特征和输出特征 输入样本通道数4、期待输出样本通道数2、卷积核大小33 具体卷积层的构建可参考博文&#xff1a;八、卷积层 设定卷积层 torch.nn.Conv2d(in_channelsin_channel,out_channelsout_channel,kernel_sizekernel_size,padding1,stride1) 必要参数&a…

大数据五次作业回顾

文章目录1. 大数据作业11.本地运行模式部分2. 使用scp安全拷贝部分2. 大数据作业21、Rrsync远程同步工具部分2、xsync集群分发脚本部分3、集群部署部分3. 大数据作业31. 配置历史服务器及日志2. 日志部分3. 其他4. 大数据作业4编写本地wordcount案例一、源代码二、信息截图5. 大…