当前位置:   article > 正文

unity websockt断线重连和心跳检测_unity websocket心跳机制

unity websocket心跳机制

本篇文章是基于BestHttp插件实现的websocket,大家可以搜索这个插件进行学习使用。

websocket是为了克服http无法双向通信而引入的,在通常的使用中,可以复用http的端口与功能,除此外,他们没有其他的联系,而是完全是独立的协议,通常情况下,http是单向的web 服务,而websocket是全双工的,服务器和客户端可以实时的传输信息,在引用时他们可以在http服务器上同时部署。

在弱网环境下,发送消息无法抵达接收端;抑或,断网到浏览器约定时限等一些异常情况都会触发onclose和onerror,所以理论上,我们只要在onclose和onerror时,重新创建长连接就可以。

思路

弱网、断连所导致重连都是被动的,而在一般的websocket连接中都是存在心跳机制的,客户端和服务端约定一个特定的心跳消息用于检测链路是否通信正常
我们通过心跳机制,在客户端来检测链路的正常,在约定时间间隔内收不到心跳或者其他任何通信消息时,客户端进行主动重连。当连接成功时,开启心跳;在收到消息时,重置心跳并开启下一轮检测,所以我们只需要在onopen和onmessage中加入心跳检测就行。

code:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using BestHTTP;
  5. using BestHTTP.WebSocket;
  6. using BestHTTP.Examples;
  7. using System;
  8. public class WebSocketModel : MonoBehaviour
  9. {
  10. string address;
  11. WebSocket webSocket;
  12. private bool lockReconnect = false;
  13. private Coroutine _pingCor,_clientPing,_serverPing;
  14. private void Start()
  15. {
  16. CreateWebSocket();
  17. }
  18. void CreateWebSocket()
  19. {
  20. try
  21. {
  22. webSocket = new WebSocket(new System.Uri("ws://8888ws"));//websocket访问地址
  23. InitHandle();
  24. webSocket.Open();
  25. }
  26. catch(Exception e)
  27. {
  28. Debug.Log("websocket连接异常:" + e.Message);
  29. ReConnect();
  30. }
  31. }
  32. void InitHandle()
  33. {
  34. RemoveHandle();
  35. webSocket.OnOpen += OnOpen;
  36. webSocket.OnMessage += OnMessageReceived;
  37. webSocket.OnClosed += OnClosed;
  38. webSocket.OnError += OnError;
  39. }
  40. void RemoveHandle()
  41. {
  42. webSocket.OnOpen -= OnOpen;
  43. webSocket.OnMessage -= OnMessageReceived;
  44. webSocket.OnClosed -= OnClosed;
  45. webSocket.OnError -= OnError;
  46. }
  47. void OnOpen(WebSocket ws)
  48. {
  49. Debug.Log("websocket连接成功");
  50. if(_pingCor!=null)
  51. {
  52. StopCoroutine(_pingCor);
  53. _pingCor = null;
  54. }
  55. _pingCor = StartCoroutine(HeartPing());
  56. // 心跳检测重置
  57. HeartCheck();
  58. }
  59. void OnMessageReceived(WebSocket ws, string message)
  60. {
  61. // 如果获取到消息,心跳检测重置
  62. // 拿到任何消息都说明当前连接是正常的
  63. HeartCheck();
  64. Debug.Log(message);
  65. }
  66. void OnClosed(WebSocket ws, UInt16 code, string message)
  67. {
  68. Debug.Log("websocket关闭," + message);
  69. webSocket = null;
  70. ReConnect();
  71. }
  72. void OnError(WebSocket ws, Exception ex)
  73. {
  74. if(ex!=null)
  75. Debug.Log("websocket连接异常:" + ex.Message);
  76. webSocket = null;
  77. ReConnect();
  78. }
  79. void ReConnect()
  80. {
  81. if (this.lockReconnect)
  82. return;
  83. this.lockReconnect = true;
  84. StartCoroutine(SetReConnect());
  85. }
  86. private IEnumerator SetReConnect()
  87. {
  88. Debug.Log("正在重连websocket");
  89. yield return new WaitForSeconds(5);
  90. CreateWebSocket();
  91. lockReconnect = false;
  92. }
  93. //心跳检测
  94. private void HeartCheck()
  95. {
  96. if(_clientPing!=null)
  97. {
  98. StopCoroutine(_clientPing);
  99. _clientPing = null;
  100. }
  101. if(_serverPing!=null)
  102. {
  103. StopCoroutine(_serverPing);
  104. _serverPing = null;
  105. }
  106. _clientPing = StartCoroutine(ClientPing());
  107. }
  108. // 这里发送一个心跳,后端收到后,返回一个心跳消息
  109. // onmessage拿到返回的心跳就说明连接正常
  110. private IEnumerator ClientPing()
  111. {
  112. yield return new WaitForSeconds(5);
  113. Send("heartbeat");
  114. _serverPing = StartCoroutine(ServerPing());
  115. }
  116. // 如果超过一定时间还没重置,说明后端主动断开了
  117. // 如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
  118. private IEnumerator ServerPing()
  119. {
  120. yield return new WaitForSeconds(5);
  121. webSocket.Close();
  122. }
  123. //发送心跳
  124. private IEnumerator HeartPing()
  125. {
  126. while(true)
  127. {
  128. yield return new WaitForSeconds(5);
  129. this.Send("heartbeat");
  130. }
  131. }
  132. //向服务端发送信息
  133. private void Send(string msg)
  134. {
  135. if (webSocket == null || string.IsNullOrEmpty(msg)) return;
  136. if(webSocket.IsOpen)
  137. {
  138. webSocket.Send(msg);
  139. }
  140. }
  141. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/107319
推荐阅读
相关标签
  

闽ICP备14008679号