Unity 基于NTP服务器获取网络时间

ESP32获取网络时间 时间是软硬件系统或设备中比较重要的东西,特别是需要和外部进行交互时就更加需要用到有个统一的时间了。目前来说只要能联网的设备的时间主要是从网络时间服务器(NTP)上获取的,这篇文章将对此做个简单的说明。 阅读详情

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

Unity 基于NTP服务器获取网络时间
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速实现 NTP 获取网络时间

为初学者节省宝贵的学习时间,避免困惑!


前言:

  当我们需要准确的时间信息时,依赖于本地系统时间可能会带来不准确的结果,特别是在需要确保时间的一致性和精确性的应用中。为了解决这个问题,我们可以通过网络时间协议(NTP)服务器来获取网络时间,从而获得更准确的时间信息。本篇博客将介绍如何在Unity中使用C#编写代码来从NTP服务器获取网络时间。


在这里插入图片描述



一、什么是NTP?


NTP,全称网络时间协议(Network Time Protocol),是一种用于同步计算机网络中设备的时间的协议。它允许计算机通过互联网或局域网获取精确的时间信息,以确保设备在分布式系统中保持时间的一致性。NTP协议的工作原理基于一组公共的时间服务器,这些服务器提供了准确的时间信息。


二、获取NTP服务器地址


要从NTP服务器获取时间,首先需要知道可用的NTP服务器的地址。以下是一些常用的NTP服务器地址,这些地址通常是可用的:
  1. pool.ntp.org
  2. cn.pool.ntp.org
  3. ntp1.aliyun.com
  4. ntp2.aliyun.com
  5. ntp3.aliyun.com
  6. asia.pool.ntp.org
  7. time.windows.com
  8. time1.cloud.tencent.com

也可以从http://www.ntp.org.cn/pool这个网址中查找自己想要的服务器地址。

在这里插入图片描述



三、通过NTP服务器获取网络时间


1、同步方式获取网络时间

/// <summary>
/// 获取网络时间 utc时间
/// </summary>
/// <param name="ntpServer"></param>
/// <param name="timeoutMilliseconds "></param>
/// <returns></returns>
private static DateTime GetNetworkTime(string ntpServer, int timeoutMilliseconds = 5000)
{
    try
    {
        const int udpPort = 123;

        var ntpData = new byte[48];                                                             // 创建一个 48 字节大小的字节数组来存储 NTP 数据
        ntpData[0] = 0x1B;                                                                      // 将 NTP 数据的第一个字节设置为 0x1B,这是 NTP 协议的请求数据格式

        var addresses = Dns.GetHostEntry(ntpServer).AddressList;                                // 获取 NTP 服务器的 IP 地址列表
        var ipEndPoint = new IPEndPoint(addresses[0], udpPort);                                 // 创建用于连接的 IP 端点,使用第一个 IP 地址和 NTP 服务器的端口 123
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);// 创建套接字,使用 IPv4 地址族、数据报套接字类型和 UDP 协议类型

        // 设置超时时间
        socket.ReceiveTimeout = timeoutMilliseconds;

        socket.Connect(ipEndPoint);                                                             // 连接到 NTP 服务器
        socket.Send(ntpData);                                                                   // 发送 NTP 数据
        socket.Receive(ntpData);                                                                // 接收 NTP 响应数据
        socket.Close();                                                                         // 关闭套接字连接

        const byte serverReplyTime = 40;                                                        // 服务器响应时间在 NTP 数据中的偏移量
        ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);                        // 从 NTP 数据中获取无符号 32 位整数部分
        ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);                  // 从 NTP 数据中获取无符号 32 位小数部分
                                                                                                // 交换整数部分和小数部分的字节顺序,以适应本地字节顺序
        intPart = SwapEndianness(intPart);
        fractPart = SwapEndianness(fractPart);

        var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);              // 将整数部分和小数部分转换为毫秒数
        var networkDateTime = (new DateTime(1900, 1, 1)).AddMilliseconds((long)milliseconds);   // 根据毫秒数计算网络时间(从 1900 年 1 月 1 日开始计算)

        TimeZoneInfo serverTimeZone = TimeZoneInfo.Local;                                       // 服务器的时区

        networkDateTime = TimeZoneInfo.ConvertTimeFromUtc(networkDateTime, serverTimeZone);

        return networkDateTime;
    }
    catch (Exception ex)
    {
        Debug.Log("获取网络时间失败: " + ex.Message);
        return DateTime.MinValue;
    }
}

// 交换字节顺序,将大端序转换为小端序或反之
private static uint SwapEndianness(ulong x)
{
    return (uint)(((x & 0x000000ff) << 24) +
                   ((x & 0x0000ff00) << 8) +
                   ((x & 0x00ff0000) >> 8) +
                   ((x & 0xff000000) >> 24));
}

2、异步方式获取网络时间

/// <summary>
/// 异步获取时间 utc时间
/// </summary>
/// <param name="ntpServer"></param>
/// <param name="timeoutMilliseconds"></param>
/// <returns></returns>
private async static Task<DateTime> GetNetworkTimeAsync(string ntpServer, int timeoutMilliseconds = 5000)
{
    try
    {
        const int udpPort = 123;
        var ntpData = new byte[48];
        ntpData[0] = 0x1B;

        var addresses = await Dns.GetHostAddressesAsync(ntpServer);
        var ipEndPoint = new IPEndPoint(addresses[0], udpPort);
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        // 设置超时时间
        socket.ReceiveTimeout = timeoutMilliseconds;

        await socket.ConnectAsync(ipEndPoint);
        await socket.SendAsync(new ArraySegment<byte>(ntpData), SocketFlags.None);
        var receiveBuffer = new byte[48];
        await socket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), SocketFlags.None);
        socket.Dispose();

        const byte serverReplyTime = 40;
        ulong intPart = BitConverter.ToUInt32(receiveBuffer, serverReplyTime);
        ulong fractPart = BitConverter.ToUInt32(receiveBuffer, serverReplyTime + 4);
        intPart = SwapEndianness(intPart);
        fractPart = SwapEndianness(fractPart);
        var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
        var networkDateTime = new DateTime(1900, 1, 1).AddMilliseconds((long)milliseconds);

        TimeZoneInfo serverTimeZone = TimeZoneInfo.Local; // 服务器的时区

        networkDateTime = TimeZoneInfo.ConvertTimeFromUtc(networkDateTime, serverTimeZone);

        return networkDateTime;
    }
    catch (Exception ex)
    {
        // 出现异常,返回 null 或抛出错误,视情况而定
        Debug.Log("获取网络时间失败: " + ex.Message);
        return DateTime.MinValue;
    }
}

// 交换字节顺序,将大端序转换为小端序或反之
private static uint SwapEndianness(ulong x)
 {
     return (uint)(((x & 0x000000ff) << 24) +
                    ((x & 0x0000ff00) << 8) +
                    ((x & 0x00ff0000) >> 8) +
                    ((x & 0xff000000) >> 24));
 }


四、通过NTP服务器池获取网络时间


使用多个NTP服务器池有助于确保你的应用程序获得准确、高可用性的时间信息,并降低了单点故障的风险。这是一个非常有用的时间管理策略,特别是对于需要时间同步的应用程序和系统。
/// <summary>
/// 同步获取网络时间(UTC时间)使用多个NTP服务器(池)
/// </summary>
/// <returns>获取到的网络时间</returns>
public static DateTime GetNetworkTimePool()
{
   var ntpServerAddresses = new List<string>
   {
       "cn.pool.ntp.org",
       "ntp1.aliyun.com" ,
       "ntp2.aliyun.com" ,
       "ntp3.aliyun.com" ,
       "ntp4.aliyun.com" ,
       "ntp5.aliyun.com" ,
       "ntp6.aliyun.com" ,
       "cn.pool.ntp.org" ,
       "asia.pool.ntp.org" ,
       "time.windows.com" ,
       "time1.cloud.tencent.com"
   };

   foreach (var serverAddress in ntpServerAddresses)
   {
       DateTime networkDateTime = GetNetworkTime(serverAddress, 2000);
       if (networkDateTime != DateTime.MinValue)
       {
           Debug.Log("获取网络时间:" + networkDateTime);

           return networkDateTime;
       }
   }

   Debug.Log("获取系统时间:" + DateTime.Now);
   return DateTime.Now;
}

/// <summary>
/// 异步获取网络时间(UTC时间)使用多个NTP服务器(池)
/// </summary>
/// <returns>获取到的网络时间</returns>
public static async Task<DateTime> GetNetworkTimeAsyncPool()
{
   var ntpServerAddresses = new List<string>
   {
       "cn.pool.ntp.org",
       "ntp1.aliyun.com" ,
       "ntp2.aliyun.com" ,
       "ntp3.aliyun.com" ,
       "ntp4.aliyun.com" ,
       "ntp5.aliyun.com" ,
       "ntp6.aliyun.com" ,
       "cn.pool.ntp.org" ,
       "asia.pool.ntp.org" ,
       "time.windows.com" ,
       "time1.cloud.tencent.com"
   };

   var tasks = ntpServerAddresses.Select(serverAddress => Task.Run(async () => await GetNetworkTimeAsync(serverAddress, 2000))).ToArray();

   while (tasks.Length > 0)
   {
       var completedTask = await Task.WhenAny(tasks);

       tasks = tasks.Where(task => task != completedTask).ToArray();

       DateTime networkDateTime = completedTask.Result;

       if (networkDateTime != DateTime.MinValue)
       {
           Debug.Log("获取网络时间:" + networkDateTime);

           return networkDateTime;
       }
   }

   Debug.Log("获取系统时间:" + DateTime.Now);
   return DateTime.Now;
}




TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!
Unity游戏时间防作弊:基于UDP协议的客户端时间同步与校验方案 在游戏开发中,时间同步是确保排行榜、活动限时、体力恢复等核心功能公平性的基础技术。其原理在于通过权威服务器时间校准客户端本地时间,防止玩家通过修改系统时间进行作弊。这项技术的核心价值在于维护游戏经济系统的稳定性和玩家体验的公平性,广泛应用于各类需要强时间一致性的在线游戏场景。本文聚焦于Unity引擎下的实现,通过UDP协议构建了一套轻量高效的时间校验方案,其中涉及网络往返时间(RTT)计算、时间偏移量(Offset)处理等关键热词,并详细解析了数据包结构与序列化、客户端UDP通信管理等实操要点,为开发者提供 阅读详情

相关推荐

【Unity】Unity中获取网络时间进行每日和每月刷新

这个代码是抓取热门网站"https://github.com"的时间,然后解析出来,获取实时的网络时间,可根据自身情况选取其他热门网站(百度、阿里等等)。 根据实时的网络时间,每次登录时,根据时间来刷新游戏中每日和每月需要刷新的数据,直接将代码挂到预制体上就能使用,可根据自身需求进行功能调整~

qq_41789645的博客 630

Unity 之 使用UnityWebRequest获取网络时间

使用UnityWebRequest获取网络时间,将其转换为本地时间和时间戳的代码实现。

陈言必行 -- Unity游戏开发领域优质博主 3800

Unity3D如何获取时间戳或北京时间

本文实例为大家分享了Unity3D获取时间戳或北京时间的具体代码,供大家参考,具体内容如下 单机游戏因为没有服务器下发时间戳所以要自己获取,当然也可以用现成的时间API来获取。 如果获取本地时间,会导致玩家随意修改日期来达到数据更改,如每日奖品、每日奖励等等。 单机游戏本来就不要网络的,可是获取时间需要网络,这有点矛盾,有没有谁有更好的解决方案呢? using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using System.Text.Reg

unity工具类篇 unity获取本地 / 网络时间

unity获取本地 / 网络时间

圈池 2149

AD20丝印层导入图片logo保姆级教程(附黑白预览避坑技巧)

本文提供了一份详尽的AD20丝印层导入图片Logo的实战指南。核心在于将图片预处理为高质量的单色BMP位图,并独家分享了利用Windows画图工具进行“黑白预览”的关键技巧,以提前规避转换失真。教程涵盖了从脚本获取、图片处理、参数设置到生产规范的完整流程,帮助硬件工程师高效、准确地在PCB的Top Overlay层添加个性化标识。

weixin_29194255的博客 386

手把手教你用Chrome DevTools逆向分析抖音a_bogus参数(附完整日志插桩方法)

本文详细介绍了如何使用Chrome DevTools逆向分析抖音a_bogus参数的生成逻辑,包括XHR断点定位、日志插桩追踪和加密核心逻辑解析。通过实战案例,帮助开发者掌握逆向工程技巧,应对抖音接口的动态加密变化,特别适合研究dy接口和a_bogus参数的技术人员。

weixin_27741699的博客 787

【Unity】Unity 基于NTP服务器获取网络时间

unity中通过NTP服务器获取网络时间

qq_41789645的博客 808

扫码器USB键盘报告描述符数据格式解析

Byte0用于判断Shift是否按下,当按下时Byte0的Bit1会置1,即0x02,若未按下,Bit为0,即0x00。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>未按下Shift。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>按下Shift。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出A。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出a。

m0_65548585的博客 1141

Unity 基于UDP实现本地时间与网络时间校验 防客户端修改日期作弊

Unity 基于UDP实现本地时间与网络时间校验 防客户端修改日期作弊

曾用名:极客柒 1209

5分钟搞定单细胞marker基因气泡图:scDotPlot保姆级教程(含Seurat适配)

本文提供了一份详细的scDotPlot R包使用教程,帮助用户在5分钟内完成单细胞marker基因气泡图的绘制。教程涵盖环境准备、Seurat和SingleCellExperiment对象的适配处理、进阶可视化技巧及自动化报告生成,特别适合生物信息学新手和临床研究者快速掌握这一高效的可视化工具。

weixin_29047545的博客 261

Ghidra逆向工具入门:从安装到实战分析baby.exe(附详细配置截图)

本文详细介绍了Ghidra逆向工具的安装配置与实战应用,通过破解CTF题目baby.exe的全过程展示其强大功能。从Java环境搭建到插件配置,再到反编译技巧与动态调试方法,帮助读者快速掌握这款免费开源的反编译神器,有效替代收费的IDA Pro工具。

weixin_29252171的博客 352

Unity判断PC本地的网络连接状态、获取网络时间

Unity判断PC本地的网络连接状态 [DllImport("winInet.dll")]//引用外部库 private static extern bool InternetGetConnectedState(ref int dwFlag, int dwReserved);//库中函数 /// <summary> /// 判断连接状态 /// </summary> public static bool IsConnected() {

CarsonEdu的博客 641

(建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)

(建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

⭐Unity 开发 | 如何通过 NTP 网络时间实现精准的跨平台时间同步【附完整源码 + UI 模块 + 偏差分析】

一文解决你在多人游戏、时间校验、反外挂场景中遇到的 “时间同步不准” 难题。

惊鸿醉的博客 2070

【深度学习新浪潮】2025年末AI产业动态:泡沫争议、技术突破与2026投资机会解析

2025年末的AI产业在波动中完成了阶段性调整,技术突破与政策支持构筑了长期成长基石,而结构性分化与风险隐患则要求投资者更加精准地把握机会。2026年作为“风险资产的黄金年”,AI全产业链将持续成为资本聚焦的核心,无论是算力国产化的技术突破,还是应用场景的规模化落地,都有望催生一批优质企业。投资者需立足产业阶段特征,理性看待短期波动,聚焦核心技术与政策红利,方能在AI产业的成长浪潮中把握确定性机会。

专注:太空算力、AI infra、异构调度、大模型成本工程 1809

基于 FPGA 的 CNN 卷积神经网络之池化层 Verilog 实现

池化层是卷积神经网络(CNN)中的关键组件,用于降低特征图的维度,减少计算量和防止过拟合。常见的池化操作包括最大池化和平均池化。FPGA 提供了高效的并行处理能力,可以加速这些操作。池化层在 CNN 中扮演重要角色,通过降低数据维度提升计算效率。在 FPGA 上实现池化层,可以充分利用硬件资源实现高效的并行计算,有助于提高实时应用中的推理速度。

走向CTO的路上... 1256

unity 时间获取

1、获取本地时间 System.DateTime.Now 2、获取网络时间 (原文出处 作者:eric_pyt@qq.com 链接:https://blog.youkuaiyun.com/pyt1234567890/article/details/83415529) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing...

Monkey_Xuan的博客 2766

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Unity通过NTP获取网络时间

最初通过qq时间服务器获得时间,经常出现有网络也获取失败的情况。 后面寻找解决办法,查找资料终于发现通过ntp时间服务器获取网络时间的方法。 首先游戏开始获得初始化网络时间,通常只获取一次,其他时间获取时间通过本地时间差加上初始网络时间获得当前时间。 GetCurrentTime()获取当前时间,GetDay()获得当前天数整点。 代码如下: using System...

weixin_30902675的博客 498

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Unity NTPComponent应用, 实现一个无后端高效获取网络时间的组件

获取当前真实的UTC时间时 => UTC时间 基数 + ( 当前游戏运行时间 - 记录时间 ) 秒数偏移。真实时间由两个部分组成, 一个是请求一次得到的 真实云UTC时间, 另外一个是当前游戏的秒数TimePoint。能在游戏内断网的时候有效获取到真实的云时间。然后记录当前的游戏运行时间 Time.unscaledTime。//这个就是一个全局的定义,自己写一个类或者 写死一个也行。在游戏启动的时候获取一个 UTC时间 基数。将脚本Copy到你的项目,拖入场景节点上。

曾用名:极客柒 1218

Unity联网状态下获取网络时间否则获取本地时间,用于Unity程序倒计时和显示时间

【代码】Unity联网状态下获取网络时间否则获取本地时间,用于Unity程序倒计时和显示时间。

weixin_44047050的博客 606

NTP算法实现客户端与服务器时间同步

通过NTP算法实现客户端与服务端时间同步。

qq_54441756的博客 175

unity 获取网络时间

http://cgi.im.qq.com/cgi-bin/cgi_svrtime public int year, mouth, day, hour, min, sec; public string timeURL = "http://cgi.im.qq.com/cgi-bin/cgi_svrtime"; void Start () { S...

kingBook928的博客 237

Unity网络时间同步:基于NTP协议的高精度跨平台C#实现

网络时间协议(NTP)是互联网中用于同步计算机系统时钟的核心协议,其工作原理是通过客户端与时间服务器交换时间戳,计算网络延迟和时钟偏移,从而校准本地时间。这项技术对于确保分布式系统的时间一致性具有重要价值,广泛应用于金融交易、日志分析、音视频同步等对时序要求严格的场景。在游戏开发与实时应用领域,精准的时间同步是保障多玩家体验一致、排行榜公平和活动逻辑正确的基石。本文聚焦于Unity引擎,深入探讨如何利用C# Socket实现一个健壮、跨平台的NTP客户端模块,解决因设备本地时钟差异导致的同步难题,并提供了完

weixin_29016833的博客 209

PUN 2.29局域网离线连接失败:NTP依赖与服务器配置全解析

在实时多人游戏开发中,网络同步是核心技术之一,它依赖于稳定的时间基准和可靠的数据传输协议。其原理是通过客户端与服务器间的时间校准和状态同步,确保所有玩家看到一致的游戏世界。这项技术的价值在于为玩家提供流畅、公平的联机体验,是MOBA、FPS、大世界探索等游戏类型的基石。常见的应用场景包括局域网对战、私有服务器部署以及需要高实时性的应用。然而,在特定环境下,例如使用Photon Unity Networking进行开发时,可能会遇到因底层库对网络时间协议的隐式依赖而导致的连接问题,尤其是在完全离线的局域网中。

weixin_34194087的博客 507

【Unity反作弊工具】Time-cheat Prevention 有效抵御时间相关的作弊行为,维护游戏的公平性和完整性

Time-cheat Prevention 是一款专为 Unity 开发者设计的反作弊工具,主要用于检测和防止时间相关的作弊行为(例如修改系统时间或游戏计时器)。它可以确保游戏的计时系统和时间敏感机制不受篡改,保护游戏公平性,尤其在多人在线游戏或竞争类游戏中十分重要。

2403_88403568的博客 1105

Unity剧院的“多剧场联动”——网络同步的底层机制

Unity剧院的“多剧场联动”网络同步,本质是“事件+状态+资源”的高效、可靠、低延迟同步。选对架构、协议和工具,结合带宽优化、时序控制和容错机制,就能实现多地、多端、多剧场的完美联动!我们继续深入,详细剖析Unity剧院“多剧场联动”网络同步的底层机制,包括同步流程、时序控制、异常处理、性能优化、实际工程建议,并给出更具体的实现思路和代码示例。Unity剧院“多剧场联动”网络同步的底层机制,核心是“事件驱动+状态同步+时序控制+容错机制”结合高效的协议、合理的架构和工程化的优化,

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 950
上一篇: Unity 基于URP使用Highlight Plus实现物体高亮
下一篇: Python运行Excel VBA宏
沐沐森的故事
博客等级 码龄9年 3791粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐沐森的故事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值