小程序使用socket.io

小程序框架实时通信:Socket.io集成 本文旨在为开发者提供在小程序框架中集成Socket.io实现实时通信的完整指南。内容涵盖从基础概念到高级应用的全套解决方案,包括协议原理、架构设计、代码实现和性能优化等方面。文章首先介绍实时通信的基础概念,然后深入Socket.io技术细节,接着提供完整的实现方案和优化策略,最后讨论实际应用场景和未来发展趋势。WebSocket:HTML5提供的全双工通信协议Socket.io:基于事件的实时通信库长轮询:模拟实时通信的传统技术事件驱动:基于事件触发的编程范式WebTransport等新协议兴起。 阅读详情

环境

服务端:Egg

  • egg2.15.1
  • egg-socket.io4.1.6

客户端:小程序

问题

1.小程序不支持socket.io

推荐使用weapp.socket.io

2.小程序端socket配置
// weapp.socket.io项目打包后的文件
const io = require('../static/js/weapp.socket.io');
io(url, {
    transports: ['websocket'], // 此项必须设置
});
3.服务端配置

Egg官方文档–sockit.io

4.服务端namespace理解
  • namespace的键需要和路由配置中io.of后面保持一致

    config.io = {
        // namespace命名空间配置为
        namespace: {
          '/api': {
            // 预处理器中间件, 我们这里配置了一个auth, 进行权限判断, 它对应的文件是/app/io/middleware/auth.js, 这里可以配置多个文件, 用逗号隔开
            connectionMiddleware: [ 'auth' ], // 这里我们可以做一些权限校验之类的操作
            packetMiddleware: [], // 通常用于对消息做预处理,又或者是对加密消息的解密等操作
          },
        },
      };
    
    io.of('/api').route('connect', io.controller.home.connect);
    
  • namespace的键需要与客户端建立连接的url的路径部分一样(端口后面,不包含查询)

    config.io = {
        // namespace命名空间配置为
        namespace: {
          '/api': {
            // 预处理器中间件, 我们这里配置了一个auth, 进行权限判断, 它对应的文件是/app/io/middleware/auth.js, 这里可以配置多个文件, 用逗号隔开
            connectionMiddleware: [ 'auth' ], // 这里我们可以做一些权限校验之类的操作
            packetMiddleware: [], // 通常用于对消息做预处理,又或者是对加密消息的解密等操作
          },
        },
      };
    
    const io = require('../static/js/weapp.socket.io');
    io('http://localhost:8080/api', {
        transports: ['websocket'], // 此项必须设置
    });
    
5.服务端io的路由配置中的route第一个参数
io.of('/api').route('connect', io.controller.home.connect);
io.of('/api').route('updatelist', io.controller.home.updatelist);
  • connect是sockte.io的自有事件(建立连接),还有disconnect(断开连接)等
  • 客户端自定义的事件updatelist,服务端要对应的修改route第一个参数updatelist
6.sockte.io客户端请求路径
io('http://localhost:8080/api', {
    transports: ['websocket'], // 此项必须设置
});
  • 请求路径是http://localhost:8080/socket.io,io会自动截取url并修改
  • 配置中url的路径部分/api,需要服务端config的io中namespace配置,并且路由中io.of参数保持一致

特殊情况

当egg服务端被Nginx代理出带有路径时,需要特殊处理,例如:请求路径需要变成http://localhost:8080/dev/socket.io

Nginx

location ^~/dev/socket.io {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://localhost:8080/socket.io;
}

sockte.io客户端

io('http://localhost:8080/api', {
    path: '/dev/socket.io',
    transports: ['websocket'], // 此项必须设置
});

上面的io第一参数url一定不要写成http://localhost:8080/dev/api,写成这样会造成服务端的namespace不匹配,看ws消息可以知道会变成/dev/api,之前是/api

7.sockte.io客户端请求配置自定义请求头等
io('http://localhost:8080/api', {
    path: '/dev/socket.io',
    transports: ['websocket'], // 此项必须设置
    extraHeaders: {
      token: wx.getStorageSync(TOKEN), // header增加了token
    },
    reconnectionAttempts: 3, // 失败后重新连接次数,一直失败总共尝试四次
    reconnectionDelay: 2000, // 重新连接间隔时间毫秒
});
8.小程序端关闭和建立连接(个人理解)
  • 变量clientSocket存储socket.io用于不同生命周期操作
  • onShow建立连接并且赋值给clientSocket,监听权限事件,成功进行下一步操作,失败断开连接
  • onHide,onUnload进行断开连接操作,断开连接操作时需要判断是否存在clientSocket,并且clientSocket.connected为true
  • 监听error事件,关闭连接
9.服务端controller定时器轮询接口,清除定时器时机
  • 定时器变量timer不要挂载在this上面,挂载在this上面没效果
  • disconnect和connect时都清除定时器
  • 先请求一次接口(防止页面更新慢),成功后再进入轮询定时器
  • 接口报错时,清除定时器(否则会一直轮询)
  • 错误中间件不会捕获到定时器中的异常,这里要特别注意,可以尝试在请求方法中判断或者可以在定时器内部写try catch处理,用try catch包裹定时器也无法捕获到错误
10.服务端请求接口无响应

小程序请求过来的请求头直接透传给接口,由于小程序请求egg是websocket所以有握手环节的协议升级

Connection: Upgrade
Upgrade: websocket

但是接口不支持websocket协议,因此握手环节就失败,更不会返回结果,处理是把这两个请求头去掉。

11.客户端建立多个websocket连接

socket.io默认只会建立一个连接,前一个执行的很可能不会触发(监听)收消息回调。此时需要配置forceNew: true

io('http://localhost:8080/api', {
    path: '/dev/socket.io',
    transports: ['websocket'], // 此项必须设置
    extraHeaders: {
      token: wx.getStorageSync(TOKEN), // header增加了token
    },
    reconnectionAttempts: 3, // 失败后重新连接次数,一直失败总共尝试四次
    reconnectionDelay: 2000, // 重新连接间隔时间毫秒
    forceNew: true,
});
12.断开真机调试后无法连接websocket

开发工具模拟器、真机调试、断开真机之后打开调试都可以连接websocket,原因是没有配置socket安全域名。小程序遇到未知报错可以使用下面代码查看

 wx.onError(err => {
      wx.showModal({
        title: 'err',
        content: err
      })
 })
微信小程序 Utils丨基于Socket.io.js,实现聊天功能 需求是 client 与 server 以 socket 方式连接对话,场景为 client 发送一条消息后,server 会返回多条消息且非同时返回。 使用微信原生的 WebSocket 及其提供的 API 后多环境调试均为能连接成功,此时考虑在小程序中集成更加成熟且使用方便的 Socket.io.js ,过程简单使用方便,很赞! 配置服务器域名 微信公众平台:https://mp.weixin... 阅读详情

相关推荐

支持微信与支付宝小程序的Socket.IO实时通信客户端实现

随着移动互联网的快速发展,用户对即时性交互体验的要求日益提升,尤其是在社交、直播、在线客服等场景中,实时通信已成为小程序应用不可或缺的核心功能。传统HTTP请求基于短连接模式,无法满足持续双向通信的需求,而WebSocket协议的出现为解决这一问题提供了技术基础。graph LRA[客户端] -- HTTP轮询 --> B[服务端]C[客户端] -- WebSocket/Socket.IO --> D[服务端]

weixin_31163455的博客 1263

小程序使用weapp.socket.io

1. 安装 $ npm install weapp.socket.io 或者,如果您使用本机方式编写代码,建议您使用 $ git clone https://github.com/10cella/weapp.socket.io $ npm run build-dev #production mode $ npm run build 2.使用 然后复制 path/weapp.socket.io/dist/weapp.socket.io.js 到你的项目 用法 代码样式与socket.io-cli

weixin_42325823的博客 4659

weapp.socket.io

微信版本编译好的soketio。

推荐开源项目:WeApp.Socket.IO - 跨端小程序实时通信解决方案

推荐开源项目:WeApp.Socket.IO - 跨端小程序实时通信解决方案 项目地址:https://gitcode.com/gh_mirrors/we/weapp.socket.io 项目简介 是一个为微信小程序、支付宝小程序、百度智能小程序等跨平台小程序设计的实时通信库,它基于 Socket.IO 进行构建,旨在提供简单易用且高度兼容的实时通讯功能。 技术分析 Socket.IO Socke...

gitblog_00091的博客 752

能在微信小程序中使用的socket . io客户端

微信小程序版 socket.io和engine.io 可以使用在微信小程序中的socket.io和engine.io 微信小程序的websocket做了一次封装,导致socket.io或者engine.io客户端包,无法直接使用 ,该项目在engine.io-client项目基础上,实现wxwebsocket的传输层,使得在小程序中能使用socket.io的所有功能。 注意:编译出来的包只能在微信小程序当中使用 安装 $ git clone https://github.com/wujjpp/socket.io.xcx.git $ cd socket.io.xcx $ npm install 运行测试服务器&测试微信小程序 运行测试服务器 $ npm run serve 使用 "微信web开发者工具" 打开examples/app项目,运行样例小程序 注意:运行测试程序,请开启"开发环境不

LLaMA-Factory全面指南:从训练到部署

LLaMA-Factory项目是一个专注于大模型训练、微调、推理和部署的开源平台。其主要目标是提供一个全面且高效的解决方案,帮助研究人员和开发者快速实现大模型的定制化需求。简化大模型训练流程:通过提供一系列预设的训练脚本和参数配置,降低用户在训练大模型时的技术门槛,使得即使是初学者也能轻松上手。增强模型微调能力:支持多种微调方法,如LoRA、QLoRA等,使用户能够根据特定任务需求对模型进行精细调整,从而提升模型性能。优化推理和部署体验。

全世界的博客 1万+

android小程序 socket,能在微信小程序中使用的socket.io客户端

微信小程序版 socket.io和engine.io可以使用在微信小程序中的socket.io和engine.io微信小程序的websocket做了一次封装,导致socket.io或者engine.io客户端包,无法直接使用,该项目在engine.io-client项目基础上,实现wxwebsocket的传输层,使得在小程序中能使用socket.io的所有功能。注意:编译出来的包只能在微信小程序当...

weixin_36317492的博客 786

在 STM32CubeIDE 中针对 STM32F407 移植 ThreadX

在 STM32CubeIDE 中针对 STM32F407 移植 ThreadX,不依赖盗版破解的Keil MDK、IAR等软件。

wangyuewu08的博客 3374

小程序中关于Taro中使用socket.io-client,踩坑

小程序中关于Taro中使用socket.io-client,踩坑

一个前端工程师 1370

ArcGIS天地图矢量化秘籍:用重分类+ArcScan高效提取建筑轮廓线

本文详细介绍了利用ArcGIS重分类和ArcScan技术高效提取天地图建筑轮廓线的半自动化流程。通过动态中断值计算、多级重分类策略和ArcScan高级矢量化技巧,显著提升城市规划中的矢量化效率与精度,适用于中级GIS用户。

weixin_30879169的博客 475

【CANoe16安装教程】亲测安装成功

CANoe16安装教程

qq_45302638的博客 2万+

小程序中 socket.io 客户端的简单用法小记

socket.io 最近公司做一个小程序,需要用到socket.io,但是没用过,内心慌的一批,只好找各种视频看,看文档,才了解了简单的使用,由于做的前端,所以就了解的前端的用法。这些也写给自己以后查看。 //创建一个链接 const io = require('./yout_path/weapp.socket.io.js') //加载js文件 const socket = io('http:...

qq_44666016的博客 3213

PCB设计中的规则优先级陷阱:为什么你的过孔总是十字连接?

本文深入解析PCB设计中Altium Designer规则优先级机制,解决过孔总是十字连接而非全连接的问题。通过分析铺铜连接原理和规则匹配逻辑,提供精确控制连接方式的技术实践,包括Custom Query使用和优先级最佳设置,帮助设计师避免常见陷阱,优化高速电路板的电气性能和制造可靠性。

banana的博客 467

推荐一款神奇的小程序框架:WeApp.Socket.IO

推荐一款神奇的小程序框架:WeApp.Socket.IO 去发现同类优质开源项目:https://gitcode.com/ 如果你在寻找一个强大而易用的小程序实时通信解决方案,那么绝对值得你的关注。该项目是专门为微信小程序设计的一个Socket.IO封装库,它使得小程序能够轻松实现WebSocket通信,从而实现更实时、低延迟的应用交互。 项目简介 WeApp.Socket.IO是基于Socket...

gitblog_00060的博客 790

S32K344 Flash Driver实战:手把手教你实现任意字节写入与扇区解锁(含C40_Ip避坑指南)

本文深入解析S32K344微控制器的Flash驱动开发,重点解决C40_Ip驱动库的8字节对齐限制和扇区保护锁问题。通过实战案例和代码示例,详细介绍了如何实现任意字节写入、扇区解锁及性能优化策略,为Bootloader和OTA升级等应用提供可靠解决方案。

weixin_33713707的博客 432

OpenHarmony电源管理驱动架构剖析:HDI框架下的低功耗实现

鸿蒙电源管理驱动模块是OpenHarmony操作系统中负责设备电源状态管理的核心组件。该模块基于HDI(Hardware Device Interface)框架实现,提供了完整的电源管理功能,包括系统休眠/唤醒、运行锁管理、休眠模式控制等核心功能。public:// 主要接口函数// 运行锁管理private:// 内部辅助函数// 成员变量public:// 运行锁控制接口// 回调管理private:// 内部辅助函数。

m0_67505153的博客 208

weapp.socket.io完全指南:打造微信小程序实时通信的终极方案

weapp.socket.io是专为微信小程序和支付宝小程序设计的WebSocket客户端库,基于socket.io 4.0版本实现,为小程序开发者提供完整的实时通信解决方案。这个强大的工具让小程序也能轻松实现聊天应用、实时数据推送、协同编辑等高级功能,彻底解决了小程序环境下的WebSocket兼容性问题。🚀 ## 为什么选择weapp.socket.io? ### 小程序实时通信的完美解决

gitblog_00718的博客 968

ABAP Channels 实战:在 ABAP 7.40 中用 WebSocket 打造实时双向通信

本文详细介绍了SAP ABAP 7.40引入的ABAP Channels通信框架,包含AMC(ABAP Messaging Channels)和APC(ABAP Push Channels)两部分。AMC作为应用服务器内部的消息总线,支持发布/订阅模式,可实现跨会话实时通信;APC基于WebSocket协议,用于浏览器等客户端与ABAP服务器的双向实时交互。文章通过一个乒乓球游戏案例展示了ABAP Channels的实时协作能力,并详细解析了AMC的配置方法、消息发送与接收的代码实现,帮助开发者理解如何利用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 220

小程序实时通信框架WeApp.Socket.IO深度解析

WeApp.Socket.IO是一个专为小程序设计的WebSocket通信框架,基于Socket.IO 4.0.0版本构建,为开发者提供了完整的实时双向通信能力。该项目采用现代化架构设计,完美适配微信和支付宝等主流小程序平台。 ## 项目核心特性 ### 完整的Socket.IO功能实现 - 消息发送队列管理 - 自动重连机制 - 心跳检测(ping/pong) - 房间和命名空间支持 - 事

gitblog_00062的博客 882

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

探索WebSocket在微信小程序中的应用:wxapp-socket-io

探索WebSocket在微信小程序中的应用:wxapp-socket-io 在当今实时通信的需求日益增长的时代,WebSocket作为一个双向通信协议,为Web和移动应用提供了低延迟、高效率的通信方式。而在微信小程序这个庞大的生态中,wxapp-socket-io项目应运而生,它是一个专为微信小程序设计的WebSocket库,让开发者能够轻松实现与服务器的实时交互。 项目简介 wxapp-soc...

gitblog_00099的博客 1301

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

基于微信小程序和nodejs的websocket方案(socket.io)

为了便捷,我在网上找到了一个封装好的socket方案,(服务端socket.io,客户端socket.io-client),但是微信小程序环境不支持socket.io-client所以在npm中找到了一个微信小程序的socket.io依赖。(weapp-socket-io),但是在使用中发现,用法根本对不上(原因是在看到他的github库的时候发现这个已经不维护了),但是在里面有一个新的地址(如果后续问题出现,再解决。服务端的用法我之前的文章里有,这里只展示微信小程序的客户端用法。

stardust_light的博客 1989

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

微信小程序的socket.io即时通讯开发(基于E聊SDK)

1.背景: 由于微信小程序需要开发轻量,跨平台,开发时间短等特点,许多公司将小程序作为了业务展示的第一个APP。E聊客户端核心SDK 通讯部分已适配了微信小程序平台,下面分享一下适配过程中的思路与方法。 2.分析: 微信小程序接入要求: 微信小程序主要支持https 与 wss 两种通讯方式,前者用于api 单次请求,后者用于长连接。上线前,必须在小程序后台配置页 配置服务器域名地址(要求备案,不能是IP地址)才能请求后端服务器,否则请求被拦截。 E聊通讯方式: E聊同时使用了http连接和socket.i

kong_dzq的博客 4078

WeApp.Socket.IO终极指南:解锁小程序实时通信完整解决方案

想要在小程序中实现**实时通信**功能吗?WeApp.Socket.IO正是你需要的完美解决方案!🚀 作为专为微信小程序和支付宝小程序设计的WebSocket客户端,它基于socket.io@3.x版本,为开发者提供了完整的实时通信能力。 ## 🔥 为什么选择WeApp.Socket.IO? **实时通信**在小程序开发中变得越来越重要,无论是聊天应用、实时数据展示还是多人协作场景,都需要

gitblog_00251的博客 701

socketio mysql_socket.io 在java与微信小程序上的应用

最近有一个这样的功能场景。用户操作完成后。服务器主动通知另一个客户端显示结果。这里涉及一个服务器推的这么一个东西。需要实现这么一个功能,对比了几个实现方式。最终选择了socket.io。1、commet,最初想到这个功能要求不高,想简单的通过commet方式实现就算了。但考虑到commet已经是比较老旧的做法了,其中有很多弊端,所以放弃了。2、netty。netty是非常棒的java nio框架。...

weixin_39638801的博客 339
上一篇: 算法入门之二叉树遍历顺序
下一篇: 面试题-实现异步队列
xiaojinglyd
博客等级 码龄9年 6粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值