unity websockt一些知识:
目录
1.目的
1.1 学习一些:unity websockt一些知识
2.参考
2.1 unity websockt断线重连和心跳检测
3.注意
3.1 需要重连
4.操作
1.目的
1.1 学习一些:unity websockt一些知识
2.参考
2.1 unity websockt断线重连和心跳检测
unity websockt断线重连和心跳检测_南城日落北城空的博客-CSDN博客_unity断线重连本篇文章是基于BestHttp插件实现的websocket,大家可以搜索这个插件进行学习使用。websocket是为了克服http无法双向通信而引入的,在通常的使用中,可以复用http的端口与功能,除此外,他们没有其他的联系,而是完全是独立的协议,通常情况下,http是单向的web 服务,而websocket是全双工的,服务器和客户端可以实时的传输信息,在引用时他们可以在http服务器上同时部署。在弱网环境下,发送消息无法抵达接收端;抑或,断网到浏览器约定时限等一些异常情况都会触发onclose和ohttps://blog.csdn.net/YCH_KING/article/details/108728081
- 发现还是以服务端 定时发我消息来判断是否连接上好点,长时间没有发消息,代表断开链接,不要用这个的心跳检测。
- good:项目中使用到了,但是有点问题
本篇文章是基于BestHttp插件实现的websocket,大家可以搜索这个插件进行学习使用。
websocket是为了克服http无法双向通信而引入的,在通常的使用中,可以复用http的端口与功能,除此外,他们没有其他的联系,而是完全是独立的协议,通常情况下,http是单向的web 服务,而websocket是全双工的,服务器和客户端可以实时的传输信息,在引用时他们可以在http服务器上同时部署。
在弱网环境下,发送消息无法抵达接收端;抑或,断网到浏览器约定时限等一些异常情况都会触发onclose和onerror,所以理论上,我们只要在onclose和onerror时,重新创建长连接就可以。
思路
弱网、断连所导致重连都是被动的,而在一般的websocket连接中都是存在心跳机制的,客户端和服务端约定一个特定的心跳消息用于检测链路是否通信正常。
我们通过心跳机制,在客户端来检测链路的正常,在约定时间间隔内收不到心跳或者其他任何通信消息时,客户端进行主动重连。当连接成功时,开启心跳;在收到消息时,重置心跳并开启下一轮检测,所以我们只需要在onopen和onmessage中加入心跳检测就行。
code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BestHTTP;
using BestHTTP.WebSocket;
using BestHTTP.Examples;
using System;public class WebSocketModel : MonoBehaviour
{string address;WebSocket webSocket;private bool lockReconnect = false;private Coroutine _pingCor,_clientPing,_serverPing;private void Start(){CreateWebSocket();}void CreateWebSocket(){try{webSocket = new WebSocket(new System.Uri("ws://8888ws"));//websocket访问地址InitHandle();webSocket.Open();}catch(Exception e){Debug.Log("websocket连接异常:" + e.Message);ReConnect();}}void InitHandle(){RemoveHandle();webSocket.OnOpen += OnOpen;webSocket.OnMessage += OnMessageReceived;webSocket.OnClosed += OnClosed;webSocket.OnError += OnError;}void RemoveHandle(){webSocket.OnOpen -= OnOpen;webSocket.OnMessage -= OnMessageReceived;webSocket.OnClosed -= OnClosed;webSocket.OnError -= OnError;}void OnOpen(WebSocket ws){Debug.Log("websocket连接成功");if(_pingCor!=null){StopCoroutine(_pingCor);_pingCor = null;}_pingCor = StartCoroutine(HeartPing());// 心跳检测重置HeartCheck();}void OnMessageReceived(WebSocket ws, string message){// 如果获取到消息,心跳检测重置// 拿到任何消息都说明当前连接是正常的HeartCheck();Debug.Log(message);}void OnClosed(WebSocket ws, UInt16 code, string message){Debug.Log("websocket关闭," + message);webSocket = null;ReConnect();}void OnError(WebSocket ws, Exception ex){if(ex!=null)Debug.Log("websocket连接异常:" + ex.Message);webSocket = null;ReConnect();}void ReConnect(){if (this.lockReconnect)return;this.lockReconnect = true;StartCoroutine(SetReConnect());}private IEnumerator SetReConnect(){Debug.Log("正在重连websocket");yield return new WaitForSeconds(5);CreateWebSocket();lockReconnect = false;}//心跳检测private void HeartCheck(){if(_clientPing!=null){StopCoroutine(_clientPing);_clientPing = null;}if(_serverPing!=null){StopCoroutine(_serverPing);_serverPing = null;}_clientPing = StartCoroutine(ClientPing());}// 这里发送一个心跳,后端收到后,返回一个心跳消息// onmessage拿到返回的心跳就说明连接正常private IEnumerator ClientPing(){yield return new WaitForSeconds(5);Send("heartbeat");_serverPing = StartCoroutine(ServerPing());}// 如果超过一定时间还没重置,说明后端主动断开了// 如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次private IEnumerator ServerPing(){yield return new WaitForSeconds(5);webSocket.Close();}//发送心跳private IEnumerator HeartPing(){while(true){yield return new WaitForSeconds(5);this.Send("heartbeat");}}//向服务端发送信息private void Send(string msg){if (webSocket == null || string.IsNullOrEmpty(msg)) return;if(webSocket.IsOpen){webSocket.Send(msg);}}}
3.注意
3.1 需要重连
4.操作
一定要再次重连,否则很难重连
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BestHTTP;
using BestHTTP.WebSocket;
using BestHTTP.Examples;
using System;public class WebSocketModel : MonoBehaviour
{string address;WebSocket webSocket;private bool lockReconnect = false;private Coroutine _pingCor,_clientPing,_serverPing;private void Start(){CreateWebSocket();}void CreateWebSocket(){try{webSocket = new WebSocket(new System.Uri("ws://8888ws"));//websocket访问地址InitHandle();webSocket.Open();}catch(Exception e){Debug.Log("websocket连接异常:" + e.Message);ReConnect();}}void InitHandle(){RemoveHandle();webSocket.OnOpen += OnOpen;webSocket.OnMessage += OnMessageReceived;webSocket.OnClosed += OnClosed;webSocket.OnError += OnError;}void RemoveHandle(){webSocket.OnOpen -= OnOpen;webSocket.OnMessage -= OnMessageReceived;webSocket.OnClosed -= OnClosed;webSocket.OnError -= OnError;}void OnOpen(WebSocket ws){Debug.Log("websocket连接成功");if(_pingCor!=null){StopCoroutine(_pingCor);_pingCor = null;}_pingCor = StartCoroutine(HeartPing());// 心跳检测重置HeartCheck();}void OnMessageReceived(WebSocket ws, string message){// 如果获取到消息,心跳检测重置// 拿到任何消息都说明当前连接是正常的HeartCheck();Debug.Log(message);}void OnClosed(WebSocket ws, UInt16 code, string message){Debug.Log("websocket关闭," + message);webSocket = null;ReConnect();}void OnError(WebSocket ws, Exception ex){if(ex!=null)Debug.Log("websocket连接异常:" + ex.Message);webSocket = null;ReConnect();}void ReConnect(){if (this.lockReconnect)return;this.lockReconnect = true;StartCoroutine(SetReConnect());}private IEnumerator SetReConnect(){Debug.Log("正在重连websocket");yield return new WaitForSeconds(5);CreateWebSocket();lockReconnect = false;}//心跳检测private void HeartCheck(){if(_clientPing!=null){StopCoroutine(_clientPing);_clientPing = null;}if(_serverPing!=null){StopCoroutine(_serverPing);_serverPing = null;}_clientPing = StartCoroutine(ClientPing());}// 这里发送一个心跳,后端收到后,返回一个心跳消息// onmessage拿到返回的心跳就说明连接正常private IEnumerator ClientPing(){yield return new WaitForSeconds(5);Send("heartbeat");_serverPing = StartCoroutine(ServerPing());}// 如果超过一定时间还没重置,说明后端主动断开了// 如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次private IEnumerator ServerPing(){yield return new WaitForSeconds(5);webSocket.Close();ReConnect();}//发送心跳private IEnumerator HeartPing(){while(true){yield return new WaitForSeconds(5);this.Send("heartbeat");}}//向服务端发送信息private void Send(string msg){if (webSocket == null || string.IsNullOrEmpty(msg)) return;if(webSocket.IsOpen){webSocket.Send(msg);}}}
unity websockt一些知识:相关推荐
- 《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览
本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.1节Unity 3D基础知识概览,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...
- Unity ECS小知识1 - PhysicsTrigger Event
Unity ECS 小知识1 - PhysicsTrigger Event ECS套件学习过程中会遇到各种问题,专门开辟一个专题"ECS小知识"来记录这些点滴.每个小知识文章是没有 ...
- Unity Mesh基础知识
Unity Mesh基础知识 什么是Mesh Mesh的组成部分 利用Mesh创建一个Cube 创建Cube 顶点坐标 渲染 转载链接 什么是Mesh Mesh是指的模型的网格,3D模型是由多 ...
- Unity UGUI 小知识
1.有个控件叫Selectable 这个控件在button,slider等身上有,也可以自行添加,可通过API搜索所有带这个控件的物体统一控制. 2.实现ScrollView只使用Scrollbar操 ...
- Unity动画系统知识体系概览
本专栏持续更新...... 更多关于Unity游戏动画的内容仍在探索和学习中......
- unity游戏开发知识检测
1.红点系统设计 参考:lua使用前缀树实现红点系统 2.快速排序 参考:快速排序详解 3.点乘,叉乘,投影的数学意义以及几何意义 点乘 数学意义: 向量点乘结果是标量,是两个向量在一个方向的累计结果 ...
- Unity资源管理——基础知识整理
部分参考自: Unity - Manual: Unity User Manual 2021.3 (LTS) UWA | 致力于游戏VR和AR应用提供项目研发解决方案 | 简单优化.优化简单 | 侑虎科 ...
- 【笔记】Unity优化 基础知识
目录 Find 和 FindObjectOfType Camera.main 按 ID 寻址 与 UnityEngine.Object 子类进行 Null 比较 矢量和四元数数学以及运算顺序 使用非分 ...
- Unity | Shader基础知识(什么是shader)
一.什么是Shader? Shader的中文名叫着色器. 二.什么是着色器? 着色器的作用:这个世界是3D的,包括在Unity的场景中,我们建的球球,方块块之类的,都是3D的,但是,屏幕是2D的,把3 ...
最新文章
- VBOX Ubuntu设置与Windows的共享文件夹
- python【力扣LeetCode算法题库】1160-拼写单词
- s5-15 开放的最短路径优先_OSPF
- for循环和数组练习
- 排序集锦(各种排序算法的特点及性能分析)
- Flink on Zeppelin 流计算处理最佳实践
- 在用v-for时又想用v-if进行判断是否生产内容
- (131)FPGA面试题-用波形图表示D触发器的功能
- Python面试题之如何用Python来发送邮件?
- SAP License:国网面试手记
- .net @什么意思_.NET和F#周报2019-4 各地微软技术俱乐部汇总 ML.NET 0.10
- python操作mysql事务提交_python关于Mysql操作
- 脚本入门(2)-perl脚本
- HTML页面基本结构代码,网页基本代码结构
- 笔记本AutoCAD启动时闪退怎么办_cad启动时闪退怎么办
- 2.4G信道跳频-LFSR-C代码实现
- python配置MySQL,需安装MySQL-pyt…
- 接入物流快递单号自动识别查询接口API
- 那些让我印象深刻的bug--02
- 你是万能的数据分析师?干什么呢?
热门文章
- 解读中国人才流动数据
- echarts图表插件炫光的分布地图动画特效
- idea实现svn拉分支和合并分支的教程
- 亿发软件:定制WMS(仓储智能管理系统),实现仓库内部精细化管理
- 基于java(ssm)旅游网站系统源码成品(java毕业设计)
- “百度杯”CTF比赛 十月场 Login
- 第十章 DirectX 绘制简单场景,地形,天空盒和跟随摄像机(下)
- IOException parsing XML document from class path resource resource [com/zj/spring01/helloworld/appli
- c语言程序设计实验8,c语言程序设计实验报告8_c语言实验报告格式及实验内容_c语言设计报告...
- 集成融云 SDK 怎么实现多端同步未读数