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

跨平台实现实时通讯

WebSocket

WebSockets 是一种先进的技术。它可以在用户的浏览器和服务器之间打开交互式通信会话。你可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应,比较典型的应用场景就是即时通讯(聊天)系统。

原生用法:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>WebSocket 示例</title></head><body><script>// 实例化 socketconst ws = new WebSocket('wss://socketsbay.com/wss/v2/1/demo/')// 监听连接的建立ws.onopen = function (ev) {console.log('建立连接...')ws.send('Hello WebSockets!')}// 监听连接的断开ws.onclose = function (ev) {console.log('断开连接...')}// 监听 socket 服务器消息ws.onmessage = function (ev) {console.log('收到消息: ' + ev.data)}</script></body>
</html>

通过以上的示例只需要对 WebSocket 建立起这样在印象:

  • 采用的是 wss:// 协议
  • 分为客户端和服务端
  • 实现连续的、长时间的与服务器通信

然而 WebSocket 提供的只是通信底层的机制,结合业务通常需进行二次封装,其中比较流行就是 socket.io

Socket.IO库

Socket.IO 是基于 WebSocket 进行的二次封装,封装了更多的业务层面的逻辑,如身份认证等、事件驱动等。

注意:其实 Socket.IO 不仅仅是封装了 WebSocket,还有基于 Ajax 的长轮询机制,在不支持 WebSocket 的环境中会自动降级为基于 Ajax 的长轮询机制。

长轮询机制可以粗暴的理解为在一个定时器中不断的重复发 Ajax 请求,以实现与服务器实时通信的功能。

  1. 下载 socket.io.js

pnpm add socket.io

然后建立连接,在建立连接进需要传入参数和登录信息:

// https://consult-api.itheima.net
const socket: Socket = io('socket服务器地址', {auth: { token: 'Bearer ' + xxx },query: { orderId: 订单id },transports: ['websocket', 'polling'],timeout: 5000,})socket.on('connect', () => {// 建立连接成功console.log('连接建立成功')})socket.on('error', (event) => {// 错误异常消息console.log('出现错误')})socket.on('disconnect', () => {// 已经断开连接console.log('断开连接')})
  • auth 登录状态信息,即  token
  • query 建立连接时传递的参数
  • transports 建立连接时使用的协议
  • timeout 超时设置

Socket.IO 是基于事件来实现数据通信的,事件的名称是由前后端商定好的。

例如:

  • 历史消息,事件名称为 chatMsgList
  • 即时消息,事件名称为 receiveChatMsg

在建立连接时服务端会通过 chatMsgList 传递历史数据,通过 on 方法进行监听来获取这些数据:

<!-- subpkg_consult/room/index.vue -->
<script setup>// 消息列表const messageList = ref<MsgItem[]>([])// 获取历史消息socket.on('chatMsgList', (res: MsgData) => {// 没有返回数据if (res.code !== 10000) returnconsole.log('历史消息:', res.data)// 提取列表数据res.data?.forEach(({ items }) => {// 追加到消息列表中messageList.value.push(...items!)})console.log('历史消息:', messageList.value)})</script>

uni-app 提供了大图查看图片的 API  uni.previewImage :

<script setup>// 预览图片const onPreviewClick = (urls: string) => {uni.previewImage({urls})}</script>


http://www.mrgr.cn/news/62062.html

相关文章:

  • Java识别图片或扫描PDF中的文字
  • NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控系统建设方案
  • 电商云分账系统你了解多少?(电商人必备工具)
  • .NET Core WebApi第4讲:控制器、路由
  • [HarekazeCTF2019]encode_and_encode1
  • 基于vue框架的的家政预定服务系统4k26i(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 【iOS】SDWebImage
  • 海外联盟营销入门:2024最新指南
  • 玄机-应急响应- Linux入侵排查
  • 单层级IVR和多层级IVR有哪些区别
  • 视频转场素材资源网站分享
  • 网站攻击,XSS攻击的类型
  • C++20 时间转本地时间,时间转字符串以及字符串转时间的方法
  • Android 13 解决 Settings 首页矢量图修改颜色不生效
  • 嵌入式操作系统那么方便好用!为啥还要用单片机?
  • StructRAG简介
  • Open SSH服务配置
  • 20 Docker容器集群网络架构:三、Docker集群部署
  • Java项目:超市管理系统(有源代码)
  • Python小白学习教程从入门到入坑------第二十课 闭包修饰器(语法基础)
  • 财务透明度不足对企业运营决策的影响
  • HarmonyOS 5.0应用开发——文件读写
  • HBuilderX 下载安装
  • 【含文档】基于ssm+jsp的高校隔离宿舍管理系统(含源码+数据库+lw)
  • idea main 不是模块 导致找不到或无法加载主类
  • OpenSSH用户枚举漏洞修复——ubuntu升级ssh版本