Unity游戏开发-客户端Http下载

Unity发送HTTP请求和文件下载 Unity发送HTTP请求和文件下载 本类库封装基于ulua框架LuaFramework 1. 使用的类库 HttpWebRequestHttpWebResponseLuaFramework 2. 实现了哪些功能 发送GET、POST请求 HTTP请求异步化 支持Lua回调 支持Host,采用Proxy的实现方式 支持将HTTP请求内容保存为文件 HTTP下载文件,支持断电... 阅读详情

本篇主要分享基于.Net实现一个客户端Http下载模块。

Http下载这块和服务器也有一定的联系,关于服务器Http下载模块的实现后面有时间再贴出来吧,主要是和客户端约定一下HttpPost参数的解析方式。

Http下载这块主要还是基于.Net库里面的HttpWebRequest类去实现的。

这里主要是封装了一些数据结构用于支持下载的显示,封装了多线程的处理避免Http请求造成线程的阻塞,封装了文件流的下载保存和md5校验。

一个分为两个部分:

HttpDownLoad-开启线程,创建下载任务,更新下载状态

HttpDownPack-Http下载任务的数据结构定义

HttpDownPack

public class HttpDownPack
{
    // 网络错误重试次数
    public int tryNum;
    // 服务器http地址
    public string url;
    // post请求参数
    public byte[] param;
    // 下载后本地文件保存路径
    public string localFile;
    // 文件的md5
    public string md5;
    // 请求超时时间
    public int timeOut = 5000;
    // 下载状态
    public HttpDownState state;
    // 当前下载的大小
    public int downSize;
}

public enum HttpDownState
{ 
    Ready = 0,
    DownLoading = 1,
    Complete = 2,
    Md5Failed = 3,
    Error = 4
}

其中param是我们post请求需要构建的参数。

整体的设计师param的前四个字节构成一个int类型,其代表的是我们给服务器推送的协议号来表示我们需要做什么样的业务。

这里将2表示为请求下载文件。

param的后续字节为当前请求类型约定的数据结构。

这里下载约定的数据结构为

// 下载任务数据结构
public class DatHttpDown
{
    // 下载路径
    public string path;
    // 当前下载的字节数
    public long startByte;
}

最终我们将协议类型2、下载数据结构转换为json字符串再转换为二进制一起写入param中构成一条完整的请求参数。

using (MemoryStream ms = new MemoryStream())
        {
            using (BinaryWriter bw = new BinaryWriter(ms))
            {
                //......

                //请求下载
                bw.Write(2);
                //构建下载参数
                DatHttpDown datHttpDown = new DatHttpDown();
                datHttpDown.path = "xxxx/xxx";
                datHttpDown.startByte = 0;
bw.Write(System.Text.Encoding.UTF8.GetBytes(LitJson.JsonMapper.ToJson(datHttpDown)));
                downPack.param = ms.ToArray();

                _httpDownLoad.AddHttpReq(downPack);
            }
        }

HttpDownLoad

首先定义了一个下载队列,里面存放的就是HttpDownPack。

提供一个AddHttpReq的方法,外部调用该方法将构建好的HttpDownPack存入队列中。

开启一个线程不停的从队列中获取HttpDownPack并执行下载任务。

下载的过程中不断的更新HttpDownPack中的数据,以便业务层可以获取到下载的进度。

public class HttpDownLoad
{
    private Thread mSendTask;
    private bool mAlive;
    private string HTTP_DOWN_PATH;

    private BlockQueue<HttpDownPack> mDownList = new BlockQueue<HttpDownPack>(50);

    public void Init()
    {
        mSendTask = new Thread(DownTask);
        mSendTask.IsBackground = true;
        mSendTask.Start();

        mAlive = true;
        HTTP_DOWN_PATH = PathMgr.instance.DownTmpPath;
        if (!Directory.Exists(HTTP_DOWN_PATH))
        {
            Directory.CreateDirectory(HTTP_DOWN_PATH);
        }
    }

    public void AddHttpReq(HttpDownPack pack)
    {
        mDownList.Enqueue(pack);
    }

    private void DownTask()
    {
        while (mAlive)
        {
            var downPack = mDownList.Dequeue();
            Down(downPack);
        }
    }

    private void Down(HttpDownPack pack)
    {
        HttpWebRequest req;
        HttpWebResponse res = null;
        req = (HttpWebRequest)WebRequest.Create(new Uri(pack.url));
        req.Method = "POST";
        req.Timeout = pack.timeOut;

        try
        {
            if (pack.param != null)
            {
                Stream stream = req.GetRequestStream();
                stream.Write(pack.param, 0, pack.param.Length);
                stream.Close();
            }

            res = (HttpWebResponse)req.GetResponse();
            string tmpFilePath = HTTP_DOWN_PATH + "/" + pack.md5;

            FileTool.DeleteFile(tmpFilePath);
            using (FileStream fs = new FileStream(tmpFilePath, FileMode.OpenOrCreate))
            {
                using (Stream resStream = res.GetResponseStream())
                {
                    byte[] buffer = new byte[1024];
                    // 下载中
                    pack.state = HttpDownState.DownLoading;
                    int size = resStream.Read(buffer, 0, 1024);
                    while (size > 0)
                    {
                        fs.Write(buffer, 0, size);
                        pack.downSize += size;
                        size = resStream.Read(buffer, 0, 1024);
                    }
                    resStream.Close();
                    fs.Close();
                }
            }

            FileTool.DeleteFile(pack.localFile);
            File.Move(tmpFilePath, pack.localFile);

            if (MD5.GetMD5FromFile(pack.localFile).Equals(pack.md5))
            {
                pack.state = HttpDownState.Complete;
                FDebug.Log("文件下载成功!"+ pack.localFile);
            }
            else
            {
                pack.state = HttpDownState.Md5Failed;
                FDebug.Log("文件md5校验失败" + pack.localFile);
            }
        }
        catch (WebException ex)
        {
            FDebug.Log("文件下载出错!" + pack.localFile);
            req.Abort();
            // 下载错误
            pack.state = HttpDownState.Error;
            FDebug.Log(ex.Message);
        }
        finally
        {
            if (res != null)
            {
                res.Close();
            }
        }
    }
}

 

Unity独立游戏大集合 Unity独立游戏大集合 Flightless Classic Flightless is a tile-based puzzle adventure game. Navigate your way through a series o... 阅读详情

相关推荐

Unity安卓局域网文件传输方案:HTTP协议实现与优化指南

在游戏开发与移动应用开发中,局域网文件传输是一项基础且关键的技术,它基于客户端-服务器(C/S)架构模型,通过本地网络协议实现设备间高效数据交换。其核心原理是利用设备在同一网络下的IP可达性,构建点对点通信链路,避免了对外部互联网和云服务的依赖。这项技术的核心价值在于保障数据传输的私密性、提升传输速度与稳定性,尤其适用于开发测试、资源热更新、日志收集等对安全与效率要求高的内网场景。本文聚焦于Unity引擎与安卓平台的集成实践,深入探讨如何利用HTTP协议这一通用、易上手的方案,结合UnityWebReque

weixin_34331102的博客 662

untiy的http请求,通过http下载资源

string json = "{\"uid\":" + uid + ",\"ChannelName\":\"" + channel + "\",\"role\":" + uid + "}"; using (UnityWebRequest webRequest = UnityWebRequest.Post(url, UnityWebRequest.kHttpVerbCREATE)) { webRequest.SetRequestHeader("...

吴梓穆的博客 3521

Unity游戏开发实战:用NativeWebSocket和Fleck实现文件上传下载(含完整代码)

本文详细介绍了在Unity游戏开发中,如何利用NativeWebSocket客户端与Fleck服务端构建高效、可靠的文件传输系统。通过设计自定义应用层协议,解决了大文件分包、粘包处理及异步传输等核心问题,并提供了完整的客户端与服务端代码实现,适用于游戏资源热更新、用户内容上传等实际场景。

php55的博客 571

Unity 安卓端Http请求下载大文件分步下载,避免内存溢出闪退问题

以上是该文件下载器实现的代码解释和说明。这个下载器使用分块下载的方式,可以更有效地下载大型文件,并且可以实时更新下载进度。在使用时,你需要根据实际情况对代码进行适当的调整和扩展。这篇文章将介绍一个简单的文件下载器实现,该实现支持分块下载和显示下载进度。我们将逐步解释代码,并提供必要的注释。以上是一个用于文件下载的C#代码段。

weixin_45224602的博客 1153

Unity MCP完全指南:构建上下文感知的AI游戏开发助手

在游戏开发中,大型语言模型(LLM)常因缺乏项目上下文而给出泛泛建议,难以解决具体问题。模型上下文协议(MCP)通过定义标准化接口,充当了AI模型与外部工具(如Unity编辑器)之间的“翻译官”和数据桥梁。其技术价值在于实现了AI对项目实时状态(如场景结构、组件属性、资产引用)的安全、结构化访问,从而将AI从“高级代码补全”升级为深度理解项目语境的“开发搭档”。在应用场景上,这直接赋能了智能场景分析、精准调试诊断和上下文感知的代码生成。本文聚焦于Unity-MCP集成,详细阐述了如何利用该协议构建一个能实时

weixin_33831196的博客 1295

探索游戏开发中的Socket和HTTP网络通信,含主流引擎的代码示例

在实际游戏开发中,往往需要综合考虑实时性、稳定性和平台适配等因素来选择适合的通信方式。有时候,甚至可以将 Socket 和 HTTP 结合起来,根据游戏场景的不同灵活选择。Socket 适用于需要高实时性和即时通信的场景,如多人在线游戏。HTTP 则适用于稳定性要求较高、跨平台数据传输的场景,如玩家数据存储和资源下载。无论选择哪种通信方式,都需要开发者具备良好的网络编程技能和合理的设计思路,以确保通信的效率、稳定性和安全性,从而为玩家创造出更加优质的游戏体验。

lsw_Cs的博客 376

Unity-Http协议请求下载系列1:接口封装HttpHelper

游戏请求服务器下载资源,是很常见的操作。特别是有热更的资源游戏,游戏启动会检查下载Bundle资源。使用的是Http协议。本人查看很多资料,实现服务器请求下载资源的方式大概有2种,其一是NET框架提供的HttpWebRequest接口,另外就是Unit引擎提供的UnityWebRequest接口。另外,是否支持断点续传。本人整合封装了上述2中实现方式,并且支持完全重新下载和断点续传2种下载模式。 这篇文章主要介绍实现Http请求的接口封装类:HttpHelper using System.Co..

成长ing中的w的专栏 956

unity-HttpWebRequest下载

unity-HttpWebRequest下载,支持断点续传,支持临时文件,ios、安卓支持

【Unity插件】Best HTTP: 简化Unity网络开发的高效工具

在Unity游戏开发过程中,网络功能是实现多人在线游戏、实时数据同步、云存储等关键特性的重要组成部分。"Best HTTP"是一款热门网络工具,它为开发者提供了一个强大、灵活且易于使用的HTTP客户端库。本文将详细介绍"Best HTTP"的主要功能、使用场景以及如何集成到Unity项目中。

Unity打怪升级 2825

1688店铺所有商品API接口(整店商品查询API接口)

1688店铺所有商品API接口、1688店铺列表API接口,1688店铺API接口,1688店铺查询商品API接口,1688店铺商品API接口,1688店铺详情接口,1688商品API接口

tbprice的博客 1568

ROS应用之如何配置RTOS满足机器人系统中的实时要求

实时操作系统(RTOS)基本概念实时操作系统(RTOS)是设计用于实时应用的操作系统,其主要目标是在确定的时间内完成任务。RTOS的任务调度算法和优先级控制机制能够确保高优先级任务按时完成。精确的传感器数据采集:传感器数据需要在规定时间内采集并传输给控制系统。快速响应外部事件:对于控制系统,需要确保指令在最短的时间内得到响应。任务的调度周期:任务的周期可以通过公式计算,其中 ftask 是任务的调度频率。优先级分配。

weixin_68094467的博客 1008

探索高效能的Unity HTTP/REST客户端:RestClient for Unity [特殊字符]

在游戏开发的世界中,高效的网络通信是连接虚拟与现实的关键。今天,我们将深入介绍一个强大的开源工具——RestClient for Unity,它以其独特的特性和卓越的性能,成为Unity开发者处理HTTP/REST请求的得力助手。 ## 项目介绍 RestClient for Unity是一个基于Unity引擎的HTTP/REST客户端库,它利用Promises机制来避免回调地狱和金字塔厄运,

gitblog_00312的博客 752

【低空经济】无人机充电站设计方案

随着无人机技术的快速发展和广泛应用,其在物流、农业、巡检、救援等领域的应用日益普及。然而,无人机的续航能力一直是限制其大规模应用的关键因素之一。为了解决这一问题,无人机充电站的设计与建设显得尤为重要。本项目旨在设计一套高效、智能、可扩展的无人机充电站系统,以满足不同场景下无人机的充电需求,提升其作业效率和应用范围。无人机充电站的设计将围绕以下几个核心目标展开:首先,充电站应具备快速充电能力,以减少无人机的停机时间,提高作业效率;

2959

【免费下载】 Best HTTP v3.11.0 Unity 插件

Best HTTP 是一款专为 Unity 引擎设计的强大HTTP客户端库,版本为3.11.0。它提供了高效、易用且功能丰富的API,以简化游戏和应用程序中的网络请求处理。这款插件支持最新的HTTP/2协议,优化了数据传输速度和资源消耗,是Unity开发者在构建需要网络交互项目时的理想选择。 ## 特性 - **高效性能**:利用底层优化,提高请求响应速度,减少内存占用。 - **HTTP/2

gitblog_09777的博客 1008

基于4G cat.1的低功耗车牌识别摄像头模组介绍

在消费类摄像头领域,4G低功耗相机已经非常普遍,在可视门锁,婴儿看护,户外监控等领域都获得了很好的应用.但是在工业领域,低功耗相机的应用还不是那么广泛.这里要介绍一款基于4G cat.1的低功耗车牌识别摄像头模组,在待机状态只有MCU和毫米波雷达以1Hz的频率工作,功耗低至500uA,并可以通过4G模块远程唤醒模组.

bindaz的专栏 1647

《多模态融合改进》支持目标检测、目标分割、OBB、姿态估计,配置教程

本文以为例,讲解如何配置,支持替换专栏里所有的改进方式。

Limiiiing的博客 795

【游戏开发题库】使用Unity制作Unity题库,支持题目录入和刷题(面试 | 笔试 | 自制题库 | 从基础到高级)

【游戏开发创新】使用Unity制作Unity题库,支持题目录入和刷题(面试 | 笔试)

linxinfa的专栏 7654

AI Agent Harness自动化漏洞扫描

本文要介绍的AI Agent Harness自动化漏洞扫描方案,正是为了解决传统漏扫的上述痛点而生。漏洞检出率提升35%以上,逻辑漏洞检出率从不足30%提升到92%误报率从27%降到3%以下,人工复核成本降低90%支持自定义业务系统、IoT、工控等多场景资产扫描,适配成本降低80%内置反馈学习机制,扫描效果越用越好AI Agent是指具备自主感知、决策、行动能力的大模型驱动程序,它可以根据给定的目标,自主调用工具、规划步骤、完成任务。

AI 原生应用开发的博客 473

简述一下Unity的UnityWebRequest

UnityWebRequest是Unity中处理网络请求的首选工具,提供了灵活、高效的API,支持多种HTTP方法和复杂的网络操作。通过本文的介绍,你应该已经掌握了UnityWebRequest的基本用法和注意事项。在实际项目中,合理使用UnityWebRequest可以帮助你轻松实现与服务器的交互,提升游戏的动态性和互动性。

ZeroBugX的博客 2360

关节电机技术全解析:原理、双编码器、控制方法与硬件选型

关于关机电机的组成,技术原理,特点以及选型等方面的详细介绍,可以帮助快速学习关节电机相关内容!

start_up_go的博客 692

现代软件开发技术 | 第1章:Spring基础

Spring是一个轻量级Java 开发框架,最早由Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。

知识库搭建ing 455

Unity游戏开发:基于MagicOnion与gRPC构建高性能实时通信客户端

在实时游戏与物联网应用开发中,高性能网络通信是核心技术挑战。gRPC作为一种基于HTTP/2的现代RPC框架,通过二进制协议、头部压缩和双向流等特性,为低延迟、高吞吐量的数据传输提供了底层支持。其技术价值在于能够显著优化传统HTTP REST API在实时场景下的性能瓶颈,特别适用于游戏状态同步、数字孪生和物联网数据交换等场景。MagicOnion作为构建在gRPC之上的C#友好层,进一步降低了开发门槛,允许开发者使用熟悉的接口定义方式实现远程调用。本文聚焦于如何在Unity中集成MagicOnion客户端

385

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

3个理由为什么Unity MCP是游戏开发的革命性工具

你是否曾经幻想过,用自然语言就能让AI助手帮你创建游戏场景、编写C#脚本、管理资源文件?Unity MCP将这个幻想变成了现实。作为一个连接AI助手与Unity编辑器的桥梁,Unity MCP通过Model Context Protocol(MCP)协议,让大型语言模型能够像人类开发者一样直接操作Unity编辑器。 ## 痛点:传统游戏开发的效率瓶颈 想象一下这样的场景:你需要为一个新项目创建

gitblog_00071的博客 844

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Unity MCP:AI驱动Unity编辑器革命,重塑游戏开发工作流

想象一下,你只需用自然语言告诉AI助手:"在原点创建一个立方体并添加刚体",几秒钟后Unity编辑器里就出现了完整的游戏对象。这不再是科幻场景,而是Unity MCP带来的现实生产力革命。作为连接AI助手与Unity编辑器的桥梁,Unity MCP通过Model Context Protocol(MCP)协议,让开发者能够用自然语言控制Unity的每一个操作,从资源管理到脚本编写,从场景构建到性能

gitblog_00479的博客 698

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Unity下使用BestHTTP插件进行Http和WebSocket通信

Unity版本:2018.4.17 BestHTTP版本:1.11.0 (下载地址) BestHTTP是Unity商店中比较流行的网络插件,兼容几乎所有的移动和独立平台。除了基础的HTTP功能,还支持WebSocket、SocketIO等常用特性,可以满足一般游戏项目的所有网络需求。 安装 下载Best HTTP v1.11.0.unitypackage后,Unity编辑器中右键"Import Package" -> "Custom Package"导入,然后在需要的代码中引入命名空间,就可以使用了

翻肚鱼儿的博客 6962

Unity游戏开发实战:如何用Fleck和NativeWebSocket实现文件上传下载(含完整代码)

本文详细介绍了在Unity游戏开发中,如何利用Fleck构建C#服务端,并结合NativeWebSocket插件实现客户端,搭建一套高效、实时的文件上传下载系统。文章提供了完整的代码示例,涵盖协议设计、异步任务管理、错误处理等核心工程细节,帮助开发者掌握基于WebSocket的二进制数据传输技术,以支持游戏动态内容更新和用户生成内容处理。

gray5的博客 447
上一篇: unity游戏开发-简易的状态机
下一篇: 方程组求解-高斯消元法
古月三齐
博客等级 码龄10年 67粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值