IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> singelR连接实现通信聊天 -> 正文阅读

[网络协议]singelR连接实现通信聊天

singelR连接实现通信聊天

singelR是什么?

SignalR是一个基于ASP.NET平台构建,利用JavaScript或者WebSockets,实现在客户端和服务端异步通信的框架(https://docs.microsoft.com/en-us/aspnet/core/signalr/javascript-client?view=aspnetcore-6.0&viewFallbackFrom=aspnetcore-3.0&tabs=visual-studio)

简单使用:

SignalR会使用Javascript的长轮询( long polling),实现客户端和服务端通信
前端通过(CarPositionChanged)像服务器发送一段数据,服务器接收后,再通过(RegisterClient)给前端推送相应的数据,整个过程中页面不会刷新

utils文件下的websocket.js文件

var senparcWebSocketConnection;
function buildConnectionAndStart(hubUrl, signalR, onStart, errorCallback,stickyCookie) {
  senparcWebSocketConnection = new signalR.HubConnectionBuilder()
    .withUrl(hubUrl)
    //.withAutomaticReconnect([0, 2000, 5000, 10000, 30000, 45000, 60000])
    .build(stickyCookie);
  senparcWebSocketConnection.start(onStart()).then().catch(function (err) {
    console.error(err.toString());
    if (errorCallback) {
      errorCallback();
    }
  });
  return senparcWebSocketConnection;
}

function requestServer(methodName, submitData) {
  senparcWebSocketConnection.invoke(methodName, submitData).catch(function (err) {
    return console.error(err.toString());
  });
}

function onReceiveMessage(methodName, receiveFunction) {
  senparcWebSocketConnection.on(methodName, function (res) {
    receiveFunction(res);
  });
}

module.exports = {
  buildConnectionAndStart: buildConnectionAndStart,
  requestServer: requestServer,
  onReceiveMessage: onReceiveMessage
}

utils文件下的onfire.js文件

!function (root, factory) {
    if (typeof module === 'object' && module.exports)
      module.exports = factory();
    else
      root.onfire = factory();
  }(typeof window !== 'undefined' ? window : this, function () {
    var __onfireEvents = {},
     __cnt = 0, // evnet counter
     string_str = 'string',
     function_str = 'function',
     hasOwnKey = Function.call.bind(Object.hasOwnProperty),
     slice = Function.call.bind(Array.prototype.slice);
  
    function _bind(eventName, callback, is_one, context) {
      if (typeof eventName !== string_str || typeof callback !== function_str) {
        throw new Error('args: '+string_str+', '+function_str+'');
      }
      if (! hasOwnKey(__onfireEvents, eventName)) {
        __onfireEvents[eventName] = {};
      }
      __onfireEvents[eventName][++__cnt] = [callback, is_one, context];
  
      return [eventName, __cnt];
    }
    
    function _each(obj, callback) {
      for (var key in obj) {
        if (hasOwnKey(obj, key)) callback(key, obj[key]);
      }
    }
   
    function on(eventName, callback, context) {
      return _bind(eventName, callback, 0, context);
    }


    function _fire_func(eventName, args) {
      if (hasOwnKey(__onfireEvents, eventName)) {
        _each(__onfireEvents[eventName], function(key, item) {
          item[0].apply(item[2], args); // do the function
          if (item[1]) delete __onfireEvents[eventName][key]; // when is one, delete it after triggle
        });
      }
    }

    function fireSync(eventName) {
      _fire_func(eventName, slice(arguments, 1));
    }
 
    return {
      on: on,
      fireSync: fireSync,
    };
  });

app.js中的应用

var signalR = require('utils/signalr.1.0.js');
可以去官网找:https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/6.0.1/signalr.js
var senparcWebsocket = require('utils/websocket.js');
const onfire = require('/utils/onfire.js');


在app.js里面定义一个函数
socketConnection: function () {
		let _this = this;
		var hubUrl =
			this.globalData.hubHost +
			'/main/signalr-hubs/content-chat?token=' +
			this.globalData.accessToken;
		var onStart = function () {
			console.log('ws started');
		};
		var onError = async function () {
			if(!getNetworkType()){
				let refreshToken = wx.getStorageSync('tokenData').refreshToken;
				if(refreshToken) await updateToken.refreshHttp(refreshToken,this);
			}
			setTimeout(() => {
				_this.socketConnection();
			}, 2000);
		};

		senparcWebsocket.buildConnectionAndStart(
			hubUrl,
			signalR,
			onStart,
			onError,
			this.globalData.stickyCookie // 拿到的cookie
		);
		this.globalData.websocket = senparcWebsocket;
		senparcWebsocket.onReceiveMessage('OnConnected', (res) => {
			console.log('OnConnected连接成功');
			if (this.globalData.onConnected) {
				this.globalData.onConnected(res);
			}
		});
		//接收消息通知
		senparcWebsocket.onReceiveMessage('MessageCreated', (res) => {
			onfire.fireSync('MessageCreated', res);
		});
	  //也可以定义其它的函数(自定义)
	
		//WebSocket 连接成功
		wx.onSocketOpen((res) => {
			console.log('WebSocket 连接成功!');
		});
		//WebSocket 已关闭
		wx.onSocketClose((res) => {
			console.log('WebSocket 已关闭!');
			setTimeout(() => {
				this.socketConnection();
			}, 1000);
		});
		//WebSocket 打开失败
		wx.onSocketError((res) => {
			console.log('WebSocket连接打开失败,请检查!');
			setTimeout(() => {
				this.socketConnection();
			}, 5000);
		});
	},

页面中的使用inde.js

const onfire = require("../../utils/onfire.js")
var currentPage;
// 接收消息
onfire.on('MessageCreated', (res) => {
	if (currentPage) {
		currentPage.handleReceiveMessage && currentPage.handleReceiveMessage(res);
	}
});
Page({
onLoad(){},
onShow(){},
handleReceiveMessage(res){
//可以在这里写逻辑要求
console.log('接收消息-----')
}
})
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:59:55  更:2022-02-28 16:03:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:40:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码