《ASP.NET本质》创建简单的Web服务器

ASP.NET Web Forms ASP.NET Web Forms 是 Microsoft ASP.NET 框架中的一种重要编程模式,用于构建动态网站和 Web 应用程序。在数据绑定方面,ItemDataBound 事件在每个项被绑定到其数据源之后发生。可以通过 DataSourceID 属性为控件指定一个数据源控件 ID,而不是直接使用数据源对象。DataKeyField 属性为 Repeater、DataList 等控件提供键值字段,以便根据键值对数据进行排序和筛选。 阅读详情

      在遥远的Unix时代,为了解决传输层的编程问题,从 4.2BSD Unix开始,Unix提供了类似于文件操作的网络操作方式——Socket。通过Socket,程序员就可以像操作文件一样通过打开、写入、读取、关闭等操作完成网络编程。这使得网络编程可以统一到文件操作之下。通过Socket帮助程序员解决网络传输层的问题,而系统中的网络系统负责处理网络内部的复杂操作,这样程序员就可以比较容易地编写网络应用程序。需要注意的是,应用层的协议需要针对网络程序专门处理,Socket不负责应用层的协议,仅仅负责传输层的协议。
      当然,网络毕竟不是简单的文件,所以,在使用Socket的时候,程序员还是需要设置一些网络相关的细节问题参数。
     当通过Socket开发网络应用程序的时候,首先需要考虑所使用的网络类型,注意包括以下三个方面:
   1)Socket类型,使用网络协议的类别,IPv4的类型为PF_INET。
   2)数据通信的类型,常见的数据包(SOCK_DGRAM)、数据流(SOCK_STREAM)。
   3)使用的网络协议,比如:TCP协议
    在同一个网络地址上,为了区分使用相同协议的不同应用程序,可以为不同的应用程序分配一个数字编号,这个编号成为网络端口号(port)。端口号是一个两字节的证书,取值范围从0~65535.IANA(Internet Assgned Number Authority,互联网地址分配机构)维护了一个有端口分配列表,这些端口分为三类,第一类范围是0~1023,称为总所周知的端口,有IANA进行控制和分配,有特定的网络程序使用,例如TCP协议使用80号端口来完成HTTP协议的传输。第二类的范围是1024~49151,称为登记端口,这些端口不由IANA控制,但是IANA维护了一个登记的列表,如果没有在IANA登记的话,也不应该在程序中使用。但是,大多数的系统中,在没有冲突的情况下,也可以由用户程序使用。第三轮的范围是49152~65535,称为动态或者私有端口,这些端口可以由普通用户使用。
       对于一个网络应用程序来说,通过地址、协议和端口号可以唯一地确定网络上的一个应用程序。其中地址和端口的组合成为端点(EndPoint)。每个Socket需要绑定到一个端点上与其他端点进行通信。
      在.NET中,System.Net命名空间提供了网络编程的大多数数据类型以及常用操作,其中常用的类型如下:
     IPAddress类用来表示一个IP地址
     IPEndPoint类用来表示一个IP地址和一个端口的组合,成为网络的端点
     System.Net.Sockets命名空间中提供了基于Socket编程的数据类型
     Socket类封装了Socket的操作。
     常用操作如下:
     Listen:设置基于连接通信的Socket进入监听状态,并设置等待队列的长度
     Accept:等待一个新的连接,当连接到达的时候,返回一个针对新连接的Socket对象。通过这个新的Socket对象,可以与新连接通信
     Receive:通过Socket接受字节数据,保存到一个字节数组中,返回实际接受的字节数。
     Send:通过Socket发送预先保存在字节数组中的数据。

下面的代码演示了如何通过Socket编程创建一个简单的Web服务器。这个服务器通过49152端口提供访问,向浏览器返回一个固定的静态网页。在这个示例中,请求的消息由浏览器生成,并发送到服务器,这个程序将简单地显示请求的信息。回应的消息由服务器程序生成,通过Socket传输层返回给浏览器。


static void Main(string[] args)
        {
            //获得本机的 loopback 网络地址
            IPAddress address = IPAddress.Loopback;
            //创建可以访问的端点
            IPEndPoint endPoint = new IPEndPoint(address, 49152);
            //创建Socket,使用IPv4地址,传输控制协议,双向、可靠、基于链接的字节流
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //将socket绑定到端点上
            socket.Bind(endPoint);
            //设置连接队列的长度
            socket.Listen(10);

            Console.WriteLine("开始监听,端口号:{0}",endPoint.Port);
            while (true)
            {
                //开始监听,这个方法会阻塞线程的执行,直到接受到一个客户端的连接请求
                Socket client = socket.Accept();
                //输出客户端地址
                Console.WriteLine(client.RemoteEndPoint);
                //准备读取客户端请求的数据读取的数据将保存在一个数组中
                byte[] buffer=new byte[4096];
                //接受数据并获取数据长度
                int length = client.Receive(buffer, 4096, SocketFlags.None);
                //将请求的数据翻译为UTF-8
                System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
                string requestString = utf8.GetString(buffer, 0, length);
                //显示请求的消息
                Console.WriteLine(requestString);
                //回应的状态行
                string statusLine = "HTTP/1.1 200 OK \r\n";
                byte[] statusLineBytes = utf8.GetBytes(statusLine);
                //准备发送到客户端的网页
                string responseBody = "<html><head><title>From Socket Server</title></head><body><h1>Hello,world</h1></body></html>";
                byte[] responseBodyBytes = utf8.GetBytes(responseBody);
                //回应头部
                string responseHeader = string.Format("Content-Type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n",responseBody.Length);
                byte[] responseHeaderBytes = utf8.GetBytes(responseHeader);
                //向客户端发送状态信息
                client.Send(statusLineBytes);
                //向客户端发送回应头
                client.Send(responseHeaderBytes);
                //头部与内容的分隔行
                client.Send(new byte[] { 13, 10 });
                //向客户端发送内容部分
                client.Send(responseBodyBytes);
                //端口与客户端的连接
                client.Close();
                if (Console.KeyAvailable)
                    break;
            }
            //关闭服务器
            socket.Close();
        }



开启服务,请求localhost:49152 模拟成功

-----------------------------------------------------------------
基于TcpListener的Web服务器

       为了简化基于TCP协议的监听程序,.NET在System.Net.Sockets命名空间中提供了TcpListener类,使用它,在构造函数中传递一组网络端点信息就可以准备好监听参数,而不再需要设置使用的网络协议等细节,调用Start方法之后,监听工作就开始了。AcceptTcpClient方法将阻塞进程,直到一个客户端的连接到达监听器,这个方法将返回一个代表客户端连接的代理对象,它的类型为TcpClient,我们可以通过对它与客户端进行通信。
      在输入输出部分,通过TcpClient对象可以得到一个用户输入和输出的网络流对性NetworkStream,这是一个派生自Stream对象的字节流对象,对Socket的输入和输出进行了封装,这样,我们可以通过常用的字节流操作来完成网络的输入和输出。

static void Main(string[] args)
        {
            //取得本机的loopback网络地址
            IPAddress address = IPAddress.Loopback;
            //创建可以访问的端点
            IPEndPoint endPoint = new IPEndPoint(address, 49152);
            //创建TCP监听器
            TcpListener newserver = new TcpListener(endPoint);
            //启动监听
            newserver.Start();
            Console.WriteLine("开始监听");
            while (true)
            {
                //等待客户端连接
                TcpClient client = newserver.AcceptTcpClient();
                Console.WriteLine("已经建立连接");
                //得到一个网络流
                NetworkStream ns = client.GetStream();
                System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
                byte[] request=new byte[4096];
                int length = ns.Read(request, 0, 4096);
                //请求信息
                string requestString = utf8.GetString(request, 0, length);
                Console.WriteLine(requestString);
                //状态行
                string statusLine = "HTTP/1.1 200 OK\r\n";
                byte[] statusLineBytes = utf8.GetBytes(statusLine);
                //网页内容
                string responseBody = "<html><head><title></title></head><body>Hello<body></html>";
                byte[] responseBodyBytes = utf8.GetBytes(responseBody);
                //回应的头部信息
                string responseHeader = string.Format("Content-Type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n",responseBody.Length);
                byte[] responseHeaderBytes = utf8.GetBytes(responseHeader);
                //输入状态行
                ns.Write(statusLineBytes, 0, statusLineBytes.Length);
                //输出回应头部
                ns.Write(responseHeaderBytes, 0, responseHeaderBytes.Length);
                //回应头部与内容之间的空行
                ns.Write(new byte[]{13,10},0,2);
                //输出内容
                ns.Write(responseBodyBytes, 0, responseBodyBytes.Length);
                //关闭客户端连接
                client.Close();
                if (Console.KeyAvailable)
                    break;
            }
            //关闭服务器
            newserver.Stop();
        }



----------------------------------------------

基于HttpListener的Web服务器
        为了进一步简化HTTP协议的监听器,.NET在命名空间System.NET中提供了HttpListener类。伴随这个对象,.NET提供了一系列相关对象封装了HTTP的处理工作。注意,这个类使用Http.sys系统组件完成工作,所以,只有在Windows XP SP2 或者 Server 2003以上的操作系统中才能使用。
       HttpListener类进一步简化了监听工作,仅需通过字符串的方法提供监听的地址、端口号以及虚拟路径,就可以开始监听工作。
      开始监听后,GetContext方法将阻塞线程,当客户端的请求到达之后,HttpListener返回一个HttpListenerContext对性爱那个最为处理客户端请求的总代理,通过代理对象的Request属性,我们可以得到一个类型为HttpListenerRequest的代表请求参数的对象,这个对象将大多数请求参数进行了对象化,所以,我们可以通过它提供的一系列属性来获取请求参数。例如HttpListenerRequest的HttpMethod属性就提供了请求的方法类型。通过代理的Response属性,可以得到一个类型为HttpListenerResponse的回应处理对象,这个对象将回应的数据和操作进行了封装,使得我们大幅度简化了回应的编程工作了。

static void Main(string[] args)
        {
            //检查系统是否支持
            if (!HttpListener.IsSupported)
            {
                throw new System.InvalidOperationException("使用HttpListener必须为Windows XP SP2 或 Server2003 以上系统");
            }
            //注意前缀必须以  / 正斜杠结尾
            string[] prefixes = new string[] {"http://localhost:49152/" };
            //创建监听器
            HttpListener listener = new HttpListener();
            //增加监听的前缀
            foreach (string s in prefixes)
            {
                listener.Prefixes.Add(s);
            }
            //开始监听
            listener.Start();
            Console.WriteLine("监听中");
            while (true)
            {
                //注意:GetContext方法将阻塞线程,知道请求到达
                HttpListenerContext context = listener.GetContext();
                //获取对象
                HttpListenerRequest request = context.Request;
                Console.WriteLine("{0}{1}HTTP/1.1",request.HttpMethod,request.RawUrl);
                Console.WriteLine("Accept:{0}",string.Join(",",request.AcceptTypes));
                Console.WriteLine("Accept-Language:{0}",string.Join(",",request.UserLanguages));
                Console.WriteLine("User-Agent:{0}",request.UserAgent);
                Console.WriteLine("Accept-Encoding:{0}",request.Headers["Accept-Encoding"]);
                Console.WriteLine("Connection:{0}",request.KeepAlive?"Keep-Alive":"close");
                Console.WriteLine("Host:{0}",request.UserHostName);
                Console.WriteLine("Pragma:{0}",request.Headers["Pragma"]);
                //取得回应对象
                HttpListenerResponse response = context.Response;
                //构造 回应内容
                string responseString = @"<html><head><title>aaa</title></head><body>Hello</body></html>";
                response.ContentLength64 = System.Text.Encoding.UTF8.GetByteCount(responseString);
                response.ContentType = "text/html;charset=UTF-8";

                System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
                System.IO.Stream output = response.OutputStream;
                byte[] responseStringBytes=utf8.GetBytes(responseString);
                //输出回应
                output.Write(responseStringBytes, 0, responseStringBytes.Length);
                if (Console.KeyAvailable)
                    break;
            }
            listener.Stop();
        }

       在使用HttpListener的时候,常用的请求和回应参数都变成了对象的属性,大幅度降低了变成的工作量。但是,大多数的参数还是需要通过Headers索引器来访问的,就像上例中的Accept-Encoding请求参数,我们就不能直接通过属性访问。

ASP.NET Web API .NET 5 入门 如今,由于众多优势,大多数应用程序都是使用 Web API 开发的。Web API 为开发人员或集成工程师提供了在各种应用程序之间进行通信的选项。Web API 减少了依赖关系,并减少了应用程序之间的耦合。 Web API 不是技术而是概念,可以使用任何技术(如 .Net、Java、Node js、PHP 等)构建。不需要了解 Web API 的后端技术,并且可以轻松实现它,从而打开了广泛的用途和概念。 在本文中,我们将详细探讨 Web API,它是什么以及如何在 ASP.Net 中开发 Web API,. 阅读详情

相关推荐

【使用ASP.NET开发Web项目】第一课——初识ASP.NET,创建第一个ASP.NET程序

知识点:理解 ASP.NET 的概念和优势、会创建 ASP.NET Web Form 程序、理解 ASP.NET Web Form 程序的执行阶段、会使用代码内嵌和代码后置两种方式进行编码。 1、网站开发基础了解 1.1 网站开发各环节组成 1.2 开发网站需要的知识结构 (1)网站开发前台页面技术 页面设计:HTML、DIV+CSS 页面特效:JavaScr...

王迪 2万+

ASP.NET中的WebService

一、WebService:WebService是以独立于平台的方式,通过标准的Web协议,可以由程序访问的应用程序逻辑单元。(1)应用程序逻辑单元:web服务包括一些应用程序逻辑单元或者代码。这些代码可以完成运算任务,可以完成数据库查询,可以完成计算机程序能够完成的任何工作。(2)可由程序访问:当前大多是web站点都是通过浏览器由人工访问的,web服务可以由计算机程序来访问。(3)标准的we协议:

scq503的专栏 743

ASP.NET 小型WEB服务器

迷你ASP.NET服务器,先运行start.exe,然后就会了~~~ WebServer.exe是从Microsoft WebMatrix中提取出来的,需要先安装.net framework。

支持.net的web服务器,支持ASP.NET的简单Web服务器Cassini Server

CassiniServer作为本地IIS运行程序,使用它可以无需要安装IIS,网站。它是一个使用Microsoft® .NET® Framework写的简单的Web服务器。使用the hosting APIs (System.Web.Hosting)展示。Cassini Web Server自Visual Studio 2005开始已经内建于开发环境内提供开发时使用。和IIS比较,Cassini...

weixin_39934085的博客 584

asp.net微型web服务器CassiniDev

Cassini 是微软发布的一个简单的 ASP.NET 服务器,也是 Visual Studio 中 ASP.NET Development Server 的前身,它不需要 IIS 的支持,通过使用 Socket 来处理网络连接。 Cassinidev 是另一个类似于 Cassini 的 ASP.NET Web 服务器,发布在 Codeplex 上。这个项目的目标是提供一个强壮的 ASP.NET Web 服务器,在使用 Cassini 或者 Visual Studio 的 Development Server 遇到限制或者困难的时候,提供一个可以独立运行的测试环境。

小型Web服务器实现

NULL 博文链接:https://junsky.iteye.com/blog/680453

自己动手模拟开发一个简单的Web服务器

自己动手模拟开发一个简单的Web服务器 时间 2015-02-01 22:45:00  博客园-原创精华区 原文  http://www.cnblogs.com/edisonchou/p/4266035.html 主题 Web服务器 Socket 开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其

sunday_qh的专栏 3498

iis几十个顶级小型简易服务器(asp,php)

iis几十个顶级小型简易服务器(asp,php)

【ASP.NET】手把手创建一个ASP.NET项目以及MVC模式的介绍

本文演示如何在 Visual Studio 工具上创建一个 ASP.NET 项目以及 MVC 模式下的项目文件的介绍。相信大家看完就会对 ASP.NET 框架有一个初步的认识。这部分介绍 ASP.NET 项目 MVC 模式下的文件信息 以上就是 ASP.NET项目的创建演示和MVC模式的介绍,希望对大家有所帮助。

好学若饥,谦卑若愚。 1万+

小型asp.net服务器(NetBox.Net v1.0)

小型的asp.net服务器(NetBox.Net v1.0) 代替IIS的小型.net服务器。 类似NetBox。 需要安装.net framework

asp.net 迷你web服务器

asp.net 迷你服务器 1 软件原理: WebDev.WebServer2为WebDev.WebServer的升级版.而WebDev.WebServer来源于一个开源的Web服务器 cassini.这个服务,跟IIS类似,可以说是IIS的简化版,虽然不如IIS完善和成熟但是用于提供一般的IIS服务已经足够了。 说白了 这个是从 VS2008 提取出来的组件 和你在VS2008看到那个调试服务器一样的

​部署asp.net web api 应用服务器教程​

ASP.NET是微软开源的服务器端 Web 应用框架,具有功能强大、类库丰富、性能出色、安全可靠、可扩展性与可维护性良好等优势。本文以开发餐厅在线点菜微信小程序后台服务为例,介绍部署asp.net web api 应用服务器的过程。涵盖开发环境与服务器准备,利用 Visual Studio 新建项目、创建控制器及注意事项,项目发布、服务器设置步骤,以及在无可视化窗口情况下如何进行参数调试,旨在助力开发者顺利完成部署工作。

qq_41664964的博客 2698

IBTrACS v04r01 数据提取实战:Pandas 筛选 JTWC/CMA/JMA 3机构最佳路径数据

本文详细介绍了如何使用 Pandas 高效提取和处理 IBTrACS v04r01 数据集中的最佳路径数据,特别针对 JTWC、CMA 和 JMA 三家权威机构的数据进行对比分析。通过构建可复用的数据提取函数,解决多机构数据质量差异问题,并提供高级分析与可视化应用示例,助力热带气旋研究。

clijovtbq401783153的博客 515

【ASP.NET】第二课——ASP.NET WebForm中的控件,掌握基本的Web服务器控件

知识点: 理解 ASP.NET 的控件的分类、掌握服务器控件和页面回发的原理、掌握基本的 Web 服务器控件、掌握服务器控件的客户端事件处理。 在第一课【使用ASP.NET开发Web项目】第一课——初识ASP.NET中,我么创建了第一个ASP.NET程序,也已经初步认识到了 ASP.NET WebForm 中的 Button、Label 和 TextBox 控件。Asp.net之所以开发方便和快捷,关键是它有一组强大的控件库,包括 HTML 控件、HTML 服务器控...

ba_wang_mao的专栏 6576

告别Keil4!手把手教你用Keil C51 V9.61编译51单片机代码(附最新激活方法)

本文详细介绍了Keil C51 V9.61在51单片机开发中的全栈升级指南,包括编译速度提升、调试器性能优化和现代开发支持等核心优势。通过智能安装方案、项目迁移实战和新特性深度应用,帮助开发者告别Keil4,大幅提升开发效率。附有最新激活方法和实用技巧,适用于嵌入式开发工程师。

weixin_26886855的博客 420

fMRI独立成分分析方法(ICA)工具GIFT

详细介绍了进行fmri数据进行ICA分析的工具包GIFT的使用,和进行ICA分析的流程。

m0_58256026的博客 1万+

【ASP.NET学习】Web Forms创建Web应用

Web Forms 是三种创建 ASP.NET 网站和 Web 应用程序的编程模式中的一种。其他两种编程模式是 Web Pages 和 MVC(Model View Controller 模型-视图-控制器)。Web Forms 是最古老的 ASP.NET 编程模式,是整合了 HTML、服务器控件和服务器代码的事件驱动网页。Web Forms 是在服务器上编译和执行的,再由服务器生成 HTML 显示为网页。

杰西笔记 2611

LLC混合滞回控制 vs 电压模/电流模:UCC25640x仿真对比与选型指南

在开关电源设计中,LLC谐振变换器的环路补偿是核心难点。传统电压模控制(VMC)和电流模控制(CMC)在LLC拓扑上存在环路增益漂移、动态响应慢等局限。混合滞回控制通过滞回比较器直接调制开关频率,并融合输出电压与谐振腔电流信息,实现了自适应环路增益和快速瞬态响应。该技术显著提升轻载效率与动态性能,适用于高密度适配器、快充及车载充电机等场景。本文基于UCC25640x系列,通过仿真对比三种控制策略,为工程选型与调试提供实践参考。

weixin_33925615的博客 334

VS 2019教程:创建ASP.NET Core Web App

启动Visual Studio 2019并创建一个新项目 启动Visual Studio 2019,然后单击Create new project。选择“ASP.NET Core Web Application.”。选择Web应用程序模板,并保留默认项目名称和位置。在带有ASP.NET Core版本的下拉列表中,选择ASP.NET Core 2.1或ASP.NET Core 2.2。点击Creat...

momo7777777的博客 2862

基于ThingsBoard+ESP8266的MQTT远程控制实战:从设备接入到仪表盘交互

本文详细介绍了基于开源物联网平台ThingsBoard与ESP8266开发板,通过MQTT协议实现远程控制的完整实战流程。从环境搭建、设备创建、仪表盘设计到核心代码编写与联调,手把手指导完成从云端到硬端的物联网闭环,为智能家居与物联网原型开发提供低成本、高效率的解决方案。

weixin_29192365的博客 330

Mac Studio M5 Ultra本地部署大模型实战:从内存原理到Ollama开发工作流

大模型推理的性能瓶颈往往不在算力,而在于内存能否装下整个模型、带宽能否持续供得上。Transformer架构每生成一个token都需要把权重完整扫一遍,决定了这本质上是内存密集型任务——统一内存架构因此成为本地部署的关键通路,超大容量与高带宽并行,让“装得下”和“跑得快”同时成立。模型量化技术(如Q4_K_M)则是另一项决定性软件策略,用轻微精度损失换取更低的硬件门槛,也是Ollama本地部署从7B到70B各类模型必做的前置功课。当本地推理服务跑起来后,借助VS Code等开发工具的OpenAI兼容API接

weixin_29043895的博客 448

ASP.net的简单认识

前言      小编最近在进入BS的学习过程中,接触到了ASP.net的框架,那么它是什么,有什么作用呢? ASP.net是什么 一、web框架    小编在微软的官网上找到关于ASP.net的介绍:ASP.net是一个用.NET构建现代Web应用程序和服务的开源Web框架, 基于HTML5,CSS和JavaScript创建简单,快速的网站,并可扩展到数百万用户。

冯浩月 4868

Intel AX系列网卡5G热点开启失败?Linux下3种修复方案实测(含Ubuntu/OpenWRT)

本文针对Intel AX系列网卡在Linux系统下无法开启5G热点的常见问题,深入剖析了其根源在于内核LAR机制与驱动的兼容性。文章提供了三种实测有效的修复方案:针对内核低于5.5的模块参数法、适用于高内核版本的hostapd补丁编译法以及高阶的驱动修改法,帮助用户在Ubuntu、OpenWRT等环境中成功启用5G热点功能。

weixin_29291863的博客 734

ASP.NET Web Forms - 服务器控件

服务器控件是服务器可理解的标签。

m0_65541699的博客 1430

【K8S系列】Kubernetes 中 Pod 无法通过 Service 名称访问服务的 DNS 解析失败问题【已解决】

在 Kubernetes 中,Service 提供了一种稳定的方式,通过名称访问一组 Pod。当其他 Pod 无法通过 Service 名称访问服务,并且出现 DNS 解析失败时,通常会导致应用无法正常工作。本文将详细分析此问题的常见原因及其解决方案。

颜淡慕潇 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: sl 简单 样式 动画
下一篇: Oracle 分页排序 笔记
sky1069
博客等级 码龄19年 7粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值