插件:Best HTTP

一、简介

WebSocket

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

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

WebSocket与Socket 
那么websocket和socket是什么关系呢? 其实可以理解为websocket是在socket的基础上实现的,其基于消息帧和TCP协议,而socket更通用,在编程中,可以选在tcp,udp,也需要自己控制数据流格式,每次的数据的长度都需要自己控制与读取。

二、使用

Best HTTP插件:这款插件不但支持WebSockets,还支持HTTP,Sockets等通信方式是一款不错的插件。也支持打包Webgl。下边记录两种Unity客户端使用WebSocket的方法。

插件

绑定

将插件包拖入unity然后在代码里引入插件类,最后写代码

代码

using UnityEngine;
using System;
using BestHTTP.WebSocket;
using System.Collections;public class WebSocketClient : MonoBehaviour
{public string address = "ws://127.0.0.1:8002";WebSocket webSocket;private bool lockReconnect = false;private Coroutine _pingCor, _clientPing, _serverPing;private void Start(){CreateWebSocket();}private void Update(){Debug.Log(lockReconnect);}/** 创建并初始化连接 start -------------------------------------------------------------------------------------------------------------------*/void CreateWebSocket(){try{webSocket = new WebSocket(new Uri(address));
#if !UNITY_WEBGLwebSocket.StartPingThread = true;
#endifInitHandle();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连接成功");webSocket.Send("一个客户端连过来了");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.LogFormat("OnClosed: code={0}, msg={1}", code, message);webSocket = null;ReConnect();}void OnError(WebSocket ws, string ex){string errorMsg = string.Empty;
#if !UNITY_WEBGL || UNITY_EDITORif (ws.InternalRequest.Response != null){errorMsg = string.Format("Status Code from Server: {0} and Message: {1}", ws.InternalRequest.Response.StatusCode, ws.InternalRequest.Response.Message);}
#endifDebug.LogFormat("OnError: error occured: {0}\n", (ex != null ? ex : "Unknown Error " + errorMsg));webSocket = null;ReConnect();}//end -------------------------------------------------------------------------------------------------------------------/** 发送信息*/public void WebSend(string msg){if (webSocket == null || string.IsNullOrEmpty(msg)) return;if (webSocket.IsOpen){webSocket.Send(msg);}}/** 关闭连接*/public void OnClose(){webSocket.Close(1000, "Bye!");}/** 重新连接*/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;}/** 心跳检测 start -------------------------------------------------------------------------------------------------------------------*/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);WebSend("heartbeat");_serverPing = StartCoroutine(ServerPing());}/** 如果超过一定时间还没重置,说明后端主动断开了* 如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次*/private IEnumerator ServerPing(){yield return new WaitForSeconds(5);if (webSocket != null){webSocket.Close();}}private IEnumerator HeartPing(){while (true){yield return new WaitForSeconds(5);this.WebSend("Heartbeat");}}//end  -------------------------------------------------------------------------------------------------------------------}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1420883.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++笔记(体系结构与内核分析)

1.OOP面向对象编程 vs. GP泛型编程 OOP将data和method放在一起,目的是通过封装、继承、多态提高软件的可维护性和可扩展性GP将data和method分开,可以将任何容器与任何算法结合使用,只要容器满足塞饭所需的迭代器类型 2.算法与仿函数的区别 …

Java8 ConcurrentHashMap 存储、扩容源码阅读

文章目录 1. 概述2. 入门实例3. 属性4. 核心方法4.1 put4.2 initTable4.3 transfer4.4 sizeCtl4.5 sizeCtl bug 1. 概述 ConcurrentHashMap 是线程安全且高效的 HashMap。 HashMap 可以看下我这篇 传送门 。 2. 入门实例 public class MyStudy {public static void main(St…

【从零开始学架构 架构基础】二 架构设计的复杂度来源:高性能复杂度来源

架构设计的复杂度来源其实就是架构设计要解决的问题,主要有如下几个:高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键,就是新旧技术之间不是完全的替代关系,有交叉,有各自的特点,所以才需要具体…

DELL T630服务器iDRAC分辨率调整办法

对于Dell T630服务器的iDRAC分辨率调整,您需要登录到iDRAC的Web界面。以下是详细的步骤: 登录iDRAC:在浏览器中输入iDRAC的IP地址,然后使用用户名(通常是“root”)和密码登录。 导航到虚拟控制台&#xff…

在Ubuntu 24.04 LTS (Noble Numbat)上安装nfs server以及nfs client

在Ubuntu 24.04 LTS (Noble Numbat)上,我使用的是最小化安装, 当然server版本的Ubuntu在安装的时候可能会有网络不通的问题,解决办法见如下文章: ubuntu 24.04 server 仅NAT模式上网设置静态IP设置-CSDN博客文章浏览阅读489次,点赞9次,收藏3次。在Ubuntu 24.04 上设置网…

2024 cleanmymac有没有必要买呢,全反面分析

在使用mac时,小编遇到了运行内存不足、硬盘空间不足的情况。遇到这种情况,我们可以借助经典的电脑深度清理软件——CleanMyMac X,清理不常用的软件和系统垃圾,非常好用!不过,有许多网友发现CleanMyMac X有免…

AI算法-高数5-线性代数1-基本概念、向量

线性代数:主要研究1、张量>CV计算机视觉 2、研究张量的线性关系。 深度学习的表现之所以能够超过传统的机器学习算法离不开神经网络,然而神经网络最基本的数据结构就是向量和矩阵,神经网络的输入是向量,然后通过每个矩阵对向量…

【动态规划】子序列问题I|最长递增子序列|摆动序列|最长递增子序列的个数|最长数对链

一、最长递增子序列 300. 最长递增子序列 算法原理: 💡细节: 1.注意子序列和子数组的区别: (1)子序列:要求顺序是固定的(要求没那么高,所以子序列就多一些) (2)子数组:要…

报告!Golang冲上来啦!

今天又来讲Go语言,根据全球知名的编程语言排行榜TIOBE在4月份公布的最新的编程语言排名,令人瞩目的是,Go语言已经跃升至历史最高位,位列排行榜第七名,并且Go语言是前十榜单中最年轻的编程语言。这一成绩不仅彰显了Go语…

数据结构·一篇搞定栈!

好久不见,超级想念 废话不多说,直接看 引言 在数据结构的大家族中,栈(Stack)是一种非常重要的线性数据结构,它的特点是后进先出(LIFO,Last In First Out)。栈在程序设…

MFC的CPen与CBush画图对象使用步骤

在MFC中,CPen和CBrush是两个常用的绘图对象,分别用于定义画笔和画刷,可以用于绘制图形、填充区域等。下面我会详细介绍如何在MFC中使用CPen和CBrush来绘制和填充图形。 使用 CPen 绘制图形: 创建 CPen 对象: 首先&am…

练习题(2024/5/12)

1二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4…

鸿蒙开发学习:初探【ArkUI-X】

ArkTS 是华为自研的开发语言。它在TypeScript(简称TS)的基础上,匹配 ArkUI 框架,扩展了声明式 UI 、状态管理等相应的能力,让开发者以更简洁、更自然的方式开发跨端应用。 ArkUI-X 进一步将 ArkUI 扩展到了多个 OS 平台…

C++组合类

类的数据成员不但可以是基本类型,也可以是其它类的对象。 组合类就是指一个类包含其他类的对象作为该类的数据成员。 当组合类创建对象时,其中包含的各个数据成员对象应首先被创建。因此,在创建类的对象时,既要对本类的基本…

C#中数组与列表,集合等的联系

C#中,所有数组都自动继承于System.Array这个抽象类,数组都为引用类型, 所有对数组的更新都会导致源数组的元素值的篡改。 而所有集合的根都来自可枚举接口IEnumerable 数组有三种样式: 数组的Rank(秩)属…

软考高项总结:第20章高级项目管理

一、高级项目管理基础 1、项目组合主要是为实现战略目标而进行的多个项目。比如村里要发展经济。制定了一个发展战略。要修路,要建厂,要种树,要整田。这些方面都有很多项目,在一起形成了项目组合。 2、项目集中的项目之间存在着关联关系,要统一考虑以实现更大利益。比如…

OpenHarmony 实战开发——如何编译OpenHarmony自带APP

概述 OpenHarmony 的主干代码是开源社区的重要学习资源,对于想进行应用开发和熟悉 OpenHarmony 能力的同学主干代码是非常重要的资源,在主干代码的 applications 目录里聚集了很多原生的应用实现,那么如何编译这些代码就是我们这篇文章的主要…

基于openEuler22.03 LTS环境的容器项目实训——分布式微服务项目部署

一、说明本文配置环境为VMware虚拟机(2核CPU,4 GB内存,40GB磁盘),OS为openEuler 22.03 LTS ,虚拟机要求能联网。二、安装docker环境2.1 安装docker相关软件包[root@node01 ~]# dnf -y install docker docker-compose2.2 查看docker版本[root@node01 ~]# docker version C…

中霖教育:税务师考试可以申请免试吗?

符合下列相应条件之一的,可报名参加税务师职业资格考试: 1.取得经济学、法学、管理学学科门类大学本科及以上学历(学位);或者取得其他学科门类大学本科学历,从事经济、法律相关工作满1年。 2.取得经济学、法学、管理学学科门类大学专科学历…

批量文本高效编辑神器:轻松拆分每行内容,一键保存更高效!轻松实现批量拆分与保存

文本处理成为我们日常工作中的一项重要任务。然而,面对大量的文本内容,传统的逐行编辑方式往往显得繁琐且效率低下。那么,有没有一种更高效、更便捷的解决方案呢?答案是肯定的——批量文本高效编辑神器,让您的文本处理…