uniapp使用WebSocket实现SignalR实时通信

2 篇文章 0 订阅
1 篇文章 0 订阅

知识点:

SignalR是对WebSocket的封装

SignalR是对WebSocket的封装但又不只是对WebSocket的简单封装,而是支持多种服务器推送的实现方式,包括WebSocket、服务器发送事件(server-sent events)和长轮询。

UniApp并不直接支持SignalR库

因为SignalR的JavaScript客户端库(@microsoft/signalr)依赖于浏览器提供的WebSocket API,而UniApp并没有提供完整的浏览器环境,因此无法直接使用SignalR库。
解决这个问题的方法之一是使用UniApp提供的原生WebSocket API来建立与SignalR Hub的连接。
因为我们都知道 这样可以绕过SignalR的JavaScript客户端库,直接在UniApp中与SignalR Hub进行通信。

Demo代码:

以下是一个使用UniApp原生WebSocket API连接到SignalR Hub的Demo

C#服务端:

1.引用“Volo.Abp.AspNetCore.SignalR” Nuget包

2.注入SignalR服务
context.Services.AddSignalR()
    .AddJsonProtocol(options =>
                     {
                         //序列化和反序列化过程中,属性名称将不会被更改
                         options.PayloadSerializerOptions.PropertyNamingPolicy = null;
                     });
app.UseEndpoints(endpoints =>
                 {
                     endpoints.MapHub<ChatSignalRHub>("/chat-signalr-hub");
                 });

3.创建名为 ChatSignalRHub.cs 的Hub类,继承自 Hub
public class ChatSignalRHub : Hub
{
    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="socketMessage"></param>
    /// <returns></returns>
    public async Task SendMessage(string socketMessage)
    {
        await Clients.All.SendAsync("ReceiveMessage", socketMessage);
    }
}

uniapp客户端:

<template>
  <view>
    <input type="text" v-model="mes" placeholder="消息" />
    <button @click="sendMessage(mes)">发送</button>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        mes:"",
        heartbeatTimer: null,

      }
    },
    mounted() {
      //连接
      uni.connectSocket({
        url: "ws://pxfyf3.natappfree.cc/chat-signalr-hub",
        method: 'GET',
        success: function() {
          // 监听WebSocket连接打开事件
          uni.onSocketOpen(function(res) {
            uni.sendSocketMessage({
              data: `{"protocol":"json", "version":1}${String.fromCharCode(0x1e)}`
            });
            console.log('WebSocket连接已打开!');
          });
        }
      });

      //心跳检测
      this.heartbeatTimer = setInterval(() => {
        uni.sendSocketMessage({
          data: `${JSON.stringify({arguments: [],target: "Heartbeat",type: 1,})}${String.fromCharCode(0x1e)}`
        }).then(response => {
          console.log('收到心跳响应:', response);
        }).catch(error => {
          console.error('发送心跳请求失败:', error);
          // 重连
          uni.connectSocket({
            url: "ws://pxfyf3.natappfree.cc/chat-signalr-hub",
            method: 'GET',
            success: function() {}
          });
          // 监听WebSocket连接打开事件
          uni.onSocketOpen(function(res) {
            uni.sendSocketMessage({
              data: `{"protocol":"json", "version":1}${String.fromCharCode(0x1e)}`
            });
            console.log('重连:WebSocket连接已打开!');
          });
        });
      }, 5000);

      //监听连接失败时
      uni.onSocketError(function(res) {
        console.log(res, 'WebSocket连接失败!');
      });

      //监听接收到服务端消息
      uni.onSocketMessage((res) => {
        var msg = res.data.replace(String.fromCharCode(0x1e), ""); //替换消息结束符
        let msgData = JSON.parse(msg);
        //接收消息
        if (msgData.type === 1 && msgData.target == "ReceiveMessage") {
          console.log('收到服务器内容:' + JSON.stringify(msgData.arguments[0]));
        }
      });

      //监听断开
      uni.onSocketClose(function(res) {
        console.log('WebSocket 已关闭!');
      });
    },
    onUnload() {
      //关闭 WebSocket 连接
      uni.closeSocket(function(res) {
        console.log('WebSocket 已关闭!');
      });
      //停止心跳检测
      if (this.heartbeatTimer) {
        clearInterval(this.heartbeatTimer);
        this.heartbeatTimer = null;
        console.log('已停止心跳检测!');
      }
    },
    methods: {
      //发送消息
      sendMessage(socketMessage) {
        // 通过 WebSocket 连接发送数据
        uni.sendSocketMessage({
          data: `${JSON.stringify({arguments: [socketMessage],target: "SendMessage",type: 1,})}${String.fromCharCode(0x1e)}`
        });
        console.log('(' + socketMessage + ')消息已发送');
      }
    }
  }
</script>

效果:

uniapp客户端发送到浏览器客户端效果图:
浏览器客户端教程:https://mp.weixin.qq.com/s/GtDw-TjlerxsrDVTwee86w

image.png

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晒黑的绵羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值