网络访问

Qt 访问网络 Qt 中访问网络使用 QNetworkAccessManager,它的 API 是异步的,这样在访问网络的时候不需要启动一个线程,在线程里执行请求的代码。(但这一点在有时候需要阻塞时就是个麻烦了)需要注意一点的是,请求响应的对象 QNetworkReply 需要我们自己手动的删除,一般都会在 QNetworkAccessManager::finished 信号的曹函数里使用 reply->deleteLater() 删除,不要直接 delete reply。 阅读详情

《OBjective C 2.0 Phrasebook - 17 network access》

开发跨平台网络可知应用程序的标准方法是使用Berkeley套接字API。它也是开发TCP/IP的一部分,并且是协议无关的。大多数语言都对这个API进行了实现。在Objective-C中,你仍然可以尽情使用C语言,它提供了所有底层接口的能力。但是大多数时候,这么做往往事倍功半。Foundation框架提供了一些类,使开发网络应用变得容易。使用这些抽象类可能会失去底层API的一些功能,但并不是很多。

封装C套接字

return [[[NSFileHandle alloc] initWithFileDescriptor: s closeOnDealloc: YES] autorelease];
在第13章我们简单介绍了NSFileHandle类,并提到它封装了一个文件描述符。套接字API的设计是基于UNIX的“所有东西都是文件,即使这没有什么意义”概念的。你可以向对待文件一样使用相同的函数读取或写入一个套接字。还可以使用NSFileHandle封装套接字。这样我们就可以使用底层API来按需创建套接字,然后采用一种更为抽象的方式来与所创建的套接字进行交互。在需要使用底层套接字API但又不方便开放给更高层API的情况下,这种方式是你唯一的选择。在其他情况下,这种方式通常也是最方便的。

注意:记住Objective-C的目标是让C程序员的生活变轻松。不到万不得已不要使用Objecive-C,仅在比使用C的API更有意义时再考虑使用它。Objective-C API的使用通常仅仅是对C API的封装,徒增了负载和复杂性,并不能使你的代码简单。

将自己的套接字封装进一个文件描述符对象的最大好处在于,你可以很方便地将它与循环整合,从而便于编写事件驱动代码。另外一大好处是你可以为你的套接字使用Objective-C引用计数。如果在创建NSFileHandle时,向closeOnDealloc:传递了YES参数,那么在该对象销毁时会关闭文件描述符。如果向你的对象发送-waitForDataInBackgroundAndNotify消息,它将被添加到文件描述符列表中,供循环轮询。在下一轮循环迭代时,如果有数据等待,NSFileHandle对象将提交一个通知。如果该通知已经被注册过,那么你就可以读取新数据了。这个方法的文档有一些误导,它宣称这个方法可以创建另外一个线程,但实际上,在OS X上,循环使用的是kqueue() API(GNUstep可能使用的是poll()或select()),并且调用该方法仅仅将另外一个文件描述符添加到其所等待的列表中。在OS X 10.6上,这是通过使用Grand Central Dispatch提交一个通知来实现的,但核心功能是一样的。最后一个好处在于,你不需要考虑缓冲区。当你从一个套接字读取数据时,你不得不首先分配缓冲区,而后传递一个指针给它,用于read()和recv()系统调用。对于文件描述符对象,你只需要读NSData实例。

如果你使用了很多字符串,可能就需要考虑在NSFileHandle上添加分类,提供-writeUTF8String:和-readUTF8String:方法,或者你的协议所使用的此类编码的等价方法,从而可以直接接收和发送字符串。

连接服务器

Objective-C为网络通信提供了一套类似Java的stream类,与底层UNIX接口一样。不幸的是,该类并不是特别有用,因为它们并未提供诸如压缩等功能,也未提供在通信期间的协商加密功能,而这些是流行协议所必须的。

NSInputStream *in;
NSOutputStream *out;
NSHost *host = [NSHost hostWithName:@"example.com"];
[NSStream getStreamsToHost: host port: 80 inputStream: &in outputStream: &out];
[in open];

其最大的限制在于,要使它们支持SRV记录很不容易。这些是DNS记录,用于标识服务和端口之间的映射,正如主机名和IP地址的映射一样。它们被用于DNS-SD,但IP地址资源的短缺使其在Internet上分层DNS系统中越来越常见。

如果在OS X上使用POSIX的getaddrinfo()函数来查询一个服务器的地址,你需要提供主机名和服务名。系统会将它们映射到所支持协议的网络地址和端口号。

当构造NSStream时,你必须将端口号指定为一个整数。这就意味着它在所有使用DNS SRV记录的服务上都会失败。但是,如果使用getaddrinfo()而后再将结果套接字封装在一个NSFileHandle中,就会正常工作。在EtoileFoundation中,我们提供了HSFileHandle上的category,可以直接由主机名和协议名来创建文件处理程序,并封装该调用。

hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
//Ask for a stream address.
error = getaddrinfo(server, service, &hints, &res0);
if (error) { return nil; }

int s = -1;
for (struct addrinfo *res = res0;
res != NULL && s < 0 ;
res = res->ai_next)
{
	s = socket(res->ai_family, res->ai_socktype,
		res->ai_protocol);
	//If the socket failed, try the next address
	if (s < 0) { continue ; }

	//If the connection failed, try the next address
	if (connect(s, res->ai_addr, res->ai_addrlen) <0)
	{
		close(s);
		s = -1;
		continue;
	}	
}
freeaddrinfo(res0);


当调用getaddrinfo()时,要以C字符串形式提交服务器和服务类型,以及hint集合等参数,用于指明你所希望的套接字类型。而后就会返回addrinfo结构数组,包含构造连接套接字的必需信息。

它们会以解析器认为最好的顺序排列,你可以按顺序一个个尝试,直到找到为止。如果同时存在IPv6和v4的连接,并且DNS有指向两者的记录,那么代码就会全部尝试。

在网络上共享对象

NSMutableDictionary *object = [NSMutableDictionary new]; 
NSConnection *conn = [NSConnection new]; 
[conn setRootObject: object]; 
if ([conn registerName: @"sharedDict"]) { [[NSRunLoop currentRunLoop] run]; }

Objective-C最强大的同时也是未被充分利用的功能之一就是分布式对象(distributed objects)系统。如果向某个对象发送一条消息,而该对象不知道该如何处理该消息,那么它将收到一条-forwardInvocation:消息,并带有将该消息封装为参数的一个对象。

和Objective-C的其他对象一样,你可以仔细考虑一下这个对象。它将告诉你有关选择器、参数数量,以及所有参数的类型和值。

Foundation框架还包括一个使用这种方法的NSDistantObject类。远端对象一般是用于向远程对象转发消息的代理。远程对象可以放在任何一个不同的进程中,甚至是不同的计算机中。

如果你将对象作为一个参数放在传递给发往远端对象的消息,那么这些对象可能会被复制,或者在远端创建远程代理回传消息。

分布式对象的使用很简单,使用分布式对象的任何程序都有两个部分:客户端和服务器。服务器为其他进程提供对象,客户端连接服务器和访问服务器。

默认情况下,对象仅为本机共享。要想通过网络共享对象,必须在注册对象时使用NSSocketPortNameServer。

NSMutableDictionary *object = (id)[NSConnection rootProxyForConnectionWithRegisteredName:@"sharedDict" 
                                   host:nil]; 
NSLog(@"Object: %@", object); 
[object setObject: @"aValue" forKey: @"aKey"]; 
NSLog(@"Object: %@", object);


这个例子展示了在进程之间共享一个NSMutableDictionary实例。要注意的是必须用NSRunLoop来处理分布式对象。分布式对象系统会添加一个IPC隧道(一个Mach端口或一个套接字),用来与循环通信。当其他进程给该端口发送消息,一些数据将通过该隧道到达,并通知DO系统。

而后它将根据收到的数据构造一个NSInvocation并调用它,然后返回结果。

doAccess[85613:903] Object:{ } 
doAccess[85613:903] Object: { aKey = aValue; }

 

寻找网络Peer

NSProcessInfo *pi = [NSProcessInfo processInfo]; 
NSString *name = [NSString stringWithFormat: @"%@/%@", [pi hostName],NSFullUserName()]; 
NSNetService *service = [[NSNetService alloc] 
                        initWithDomain: @"" 
                        type: type name: name port: 123]; 
[service publish]; 
NSNetServiceBrowser *sb = [NSNetServiceBrowser new]; 
[sb setDelegate: self]; 
[sb searchForServicesOfType: type inDomain: @""];

多年来,有很多用来寻找本地网络服务的协议,包括NetBIOS和AppleTalk,它们直到90年代在本地网络中还很常见,直到后来被TCP/IP取代。

TCP/IP协议栈并不包括发现服务的全部功能,它的最新内容是广播地址。如果向广播地址发送包,那么这个网段上所有人都会收到。这就会带来很多问题,它仅仅工作在本地物理网段内,在现在的交换网络中效率不高,并且它是很底层的一种方法。

IETF的ZeroConf工作组建议使用多播DNS(mDNS)来解决这一问题。DNS是发布映射的一种可扩展方式,通常用来解析主机名和IP地址的映射,但也可以用于诸如电话号码、地利信息和其他类型的主机之类的东西上。

通过mDNS,个人计算机可以在.local域中发布DNS记录。它被用于DNS服务发现(DNS-SD)的基础,描述了一种通过DNS广告任意服务的方式。可以将该标准和传统的层级DNS一起用,但最好的方式是与mDNS一起用。

这两种标准的组合经常被称为Bonjour,并通过NSNetService 类开放给Objective-C。它允许应用程序发布DNS-SD记录并为特定服务找到所有记录。

OS X上的很多程序都用到它。Safari用它共享书签;iChat用它来为无服务器消息找到通讯簿;iTunes用它来共享音乐;系统用它来查找共享文件夹和打印机。如果你正在开发多种类型的网络应用程序,你会发现使用NSService向peer发布广告很有用。

在发布服务时,必须指定唯一名。如果正在使用分布式对象(在本章末尾将介绍它),你就可以用它作为你正在服务的对象的名称,并忽略Bonjour系统的DNS相关的基础。至于其他的,你所发布的端口通常都更为有用,名字则是发布给用户的。

使用NSNetServiceBrowser类搜索peer。如何正确使用它有些棘手。发布服务是同步的,向NSNetService实例发送-publish消息,服务就被发布了。搜索则是异步的,需要激活一个循环。

当你向浏览器发送搜索消息时,它将传送一个DNS请求。在返回应答之前可能需要一段时间,在此期间,你肯定不希望阻止用户做别的事情,因此这个方法应立刻返回。

当收到响应时,该类将发送一个消息给它的委托,消息中带有一个新的NSNetService实例,描述了它所找到的所有服务器。而后它将持续侦听,直到你向它发送-Stop消息。

很多情况下,你从不发送这个消息。在进程运行期间,你可以任由浏览器在后台运行,每当在本地网络中发现一个新的peer时都会得到一个通知。而后你可以更新用户接口为用户显示这个新peer。这个有点象iTunes,添加一个出现在网络上的新的共享列表到库中。

 

通过URL加载数据

[NSAutoreleasePool new];
NSArray *args = [[NSProcessInfo processInfo] arguments];
NSString *target = [args objectAtIndex:1];
NSURL *targetURL = [NSRUL URLWithString:target];
if(nil == targetURL) {return 1;}
NSURLRequest *req = [NSURLRequest requestWithURL:targetURL];
id delegate = [DownloadDelegate new];
NUSURLDownload *dl = [[NSURLDownload alloc] initWithRequest:req delegate:delegate];
[dl setDestination:[targetURL lastPathComponent] allowOverwrite:YES];
[[NSRunLoop currentRunLoop] run];


在编写Internet程序时,你可能会希望从由统一资源定位符(URL)所标识的远端位置获取数据。URL是全球标识符,拥有一套机制及相关的数据。Foundation框架的NSURL类用于封装URL,可以通过字符串解析URL并返回一个抽象表示。

Foundation还有两个从URL获取数据的类,其中NSURLDownload类较为简单,封装了从远端URL下载数据的方法。复杂一些的是NSURLConnection类,它提供了处理请求和响应的底层方法。

URL加载系统是协议无关的,但需要符合请求-响应格式。请求被封装在NSURLRequest中,然后发送给上述两个类中的一个。它将构造连接并发送该请求,而后在回应中给你提供一个或多个NSURLResponse对象。

Foundation框架可以加载来自file://, http://, https://和ftp://等类型的URL。也可以通过实现一个NSURLProtocol子类使之支持其他协议。虽然很少需要这么做,但你可能希望实现对SFTP的支持或类似的类。而后你可以重用已有代码委托文件访问URL加载系统。

本节的例子展示了如何从用户指定的远程URL获取一个文件,它使用了一个委托类来向用户报告进程,尽管这并不是必需的。

委托存储了响应的大小,因此它可以报告进度。如果传输失败,它会报告一个本地错误消息。如果正常,它会在每下载1%内容是打印出一个点。

URL加载子系统很强大,但在大多数时候你应该将其限制在上述例子的子集中。这使你使用非常少的代码来实现一个简单的web服务。



 

 

 





python特征选择pso_【来点干货】机器学习中常用的特征选择方法及非常详细的Python实例... 花费了很长时间整理编辑,转载请联系作者授权,违者必究。特征选择(Feature selection)是在构建预测模型的过程中减少输入变量的一个过程。它是机器学习中非常重要的一步并在很大程度上可以提高模型预测精度。这里我总结了一些机器学习中常见的比较有用的特征选择方法并附上相关python实现code。希望可以给大家一些启发。首先,我们为什么要进行特征选择呢?它有以下几个优点:减少过拟合:冗余数据常... 阅读详情

相关推荐

EB tresos配置指南:CAN通信信号收发全流程解析

本文详细解析了使用EB tresos配置工具实现AUTOSAR架构下CAN通信信号收发功能的全流程。从环境准备、COM模块信号定义、PduR路由配置、CanIf硬件抽象到CAN驱动层设置,提供了清晰的步骤指南和关键配置要点,帮助开发者快速打通从应用层到物理层的数据链路,实现可靠的CAN通信。

weixin_29192141的博客 508

mDNS协议

mdns

qq_38148090的博客 6922

Versal - 从零构建Petalinux 2024.2 AI边缘计算平台(VD100+SDT+JupyterLab实战)

本文详细介绍了如何从零开始,基于AMD Versal VD100开发板和Petalinux 2024.2构建AI边缘计算平台。内容涵盖开发环境搭建、Petalinux工程创建与配置、SDT新流程实战、启动SD卡制作,并最终集成JupyterLab与Conda,打造出开箱即用的交互式AI开发环境,帮助开发者快速进行算法验证与部署。

5f4d3s2a1q的博客 488

【亲测免费】 探索 `mdns`:一款轻量级的 Multicast DNS 工具

在深入技术细节之前,让我们先了解一下 这个项目。这是一款由 Martin Jansson 开发的、基于 C 语言的轻量级 Multicast DNS(mDNS)实现。mDNS 是一种允许设备在本地网络中发现彼此而无需依赖集中式 DNS 服务器的技术,尤其适用于智能家居、物联网(IoT)和无线设备。 ## 技术分析 - **Multicast DNS**: mDNS 基于标准的 DNS 协议,

gitblog_00043的博客 1747

告别安装报错!保姆级教程:用阿狸狗破戒大师V3.2.6搞定Cadence 17.4完整安装与补丁

本文提供Cadence 17.4的完整安装与破解教程,特别针对国内用户常见问题优化。从前期准备、镜像处理到阿狸狗破戒大师V3.2.6的智能破解,再到补丁管理与性能调优,详细指导每一步操作,确保一次性安装成功并提升设计效率。

weixin_30632089的博客 836

YOLOv8中间特征层可视化

在通过观察这些特征,可以清楚地看到模型如何逐步将输入图像转化为有意义的表示。

weixin_45314480的博客 6890

mDNS开源项目指南及常见问题解决方案

项目名称:mjansson/mdns **主要编程语言**:C mjansson/mdns 是一个遵循公共领域声明(Unlicense)的开源项目,提供了一个跨平台的mDNS(多播DNS)与DNS-SD库。这个纯C语言编写的库允许开发者实现设备在局域网内的服务发现和单次记录的mDNS查询响应,无需任何内存分配,所有缓冲区需由调用者传递。作者Mattias Jansson (@maniccoder

gitblog_07276的博客 875

从KVM虚拟化到Openstack云化架构综述

目录 摘要 OpenStack的虚拟化技术 OpenStack架构介绍 Nova Swift KeyStone Neutron Glance Cinder Ceilometer Heat 摘要 这两年的工作中,接触到公有云和私有云的项目还不少。起初对于Openstack的了解,仅停留在其几大组件的交互上,如Nova、Neutron、Glance等,以及对各大云厂商功能点上...

liyunpeng229的博客 2051

ComfyUI-Fluxtapoz与其他Flux插件对比:为什么它是并置任务的最佳选择?

ComfyUI-Fluxtapoz是一款专为Flux模型设计的ComfyUI插件,专注于提供高效、精准的图像并置解决方案。作为GitHub加速计划中的重要项目,它通过一系列定制化节点解决了传统图像编辑中多区域控制难题,为AI绘画爱好者和专业创作者带来了全新的创作可能。 ## 什么是图像并置任务? 图像并置(Image Juxtaposition)是指在单张图像中融合不同风格、主题或元素的创作技

gitblog_00103的博客 1022

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

算法大师! 1148

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

J。 2339

乐鑫ESP使用mDNS实现局域网内域名解析实现EMQX传送MQTT单片机串口数据

主要还是因为不了解DNS和mDNS原理导致。很多时候,问题的解决方案往往就在身边,做技术多了就更深有体会,虽然答案在身边,但却得找一圈,等你快放弃的时候突然就柳暗花明,忍不住来一句:“卧槽”。但解决的过程真的是心流的体会,忘记了时间存在!之前安装ESP开发环境也是如此,总在准备放弃的时候,心里想着再试试看,就真解决了!还有个小问题,网上说win10是自带mDNS,只有winxp-win8没有,我一台win10是因为安装过苹果ITuns驱动,所以直接就可用,不知道是不是因为这原因。

赵小龙Corder 841

第38节:cesium 风场效果(含源码+视频)

cesium 风场效果

qq_29384639的博客 2330

Android访问网络

今天总结一下Android端访问网络的两种形式,并没有具体的代码,就是简单的一个小结。     一.TCP—IP协议下的网络访问(socket访问,基于传输层)          它的应用主要在即时消息的发送和即时消息的推送上。          传递数据的方式主要分为以下三步:           1.用ServerSocket创建TCP服务器端,等待用户的连接,结束后调用Close()

小娴不是仙的博客 545

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android 访问网络,Android开发之HTTP访问网络

本文实例为大家详细介绍了Android开发之HTTP访问网络的相关代码,供大家参考,具体内容如下代码1:package com.ywhttpurlconnection;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import a...

weixin_33837516的博客 519

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【云原生 • Kubernetes】认识 k8s 网络、外部网络访问 k8s 内部服务

Kubernetes 网络结构介绍、外部网络访问 k8s 内部服务的方法。

商务合作 | 共同学习 | 携手共进 9万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

XP系统网络不能访问

1.检查guest账户是否开启   XP默认情况下不开启guest账户,因此些为了其他人能浏览你的计算机,请启用guest账户。同时,为了安全请为guest设置密码或相应的权限。当然,也可以为每一台机器设置一个用户名和密码以便计算机之间的互相访问。   2.检查是否拒绝Guest用户从网络访问本机   当你开启了guest账户却还是根本不能访问时,请检查设置是否为拒绝gu

挨踢人生 816

网络访问层

网络访问层是最神秘、最不统一的TCP/IP层,它管理为物理网络准备数据所必须的服务和功能,包括: 与计算机网络适配器的连接 根据合适的访问方式调整数据传输 把数据转化为电子流或模拟脉冲的形式,以在传输介质上进行传输 对接收到的数据进行错误检查 给发送的数据添加错误检查信息,从而让接收端计算机能够对数据进行错误检查 。TCP/IP网络访问层大致对应于OSI的物理层和数据链路层。OSI的物理层负责吧数据

daidai_1204的专栏 841

使用OkHttp访问网络

使用网络通信库我们不仅限于使用原生的HttpURLConnection,除了这个还有其他的也是非常好用的,就比如说OkHttp,使用过之后感觉比原生的HttpURLConnection还要简单易用,下面我们就来学习一下。 要使用OkHttp首先要导入依赖,要导入依赖我们要先去OkHttp的项目主页地址看一下他现在的版本号,和一些要注意的事项。 项目主页地址:https://github.com...

z1web的博客 2125

网络访问回调

网络访问是耗时操作,所以我们需要开启一个子线程在子线程里进行访问。但是这样有一个问题就是,当子线程已经结束这个时候访问的结果还没有返回怎么办呢?这个时候我们就需要通过回调来获得返回的值。1、定义一个接口 2、将接口加入到网络访问的代码中,并返回访问结果代码示例: 1、定义一个接口public interface HttpCallbackListener { //访问成功的回调接口 voi

秦时明月 1043

允许网络访问PostgreSQL

PostgreSQL默认安装后是不允许网络访问的,只允许本机(local)访问。如果要求网络上其他主机通过TCP/IP访问需要两步: 一、开放端口是数据库端口(默认5432)监听来自所有网络的请求。找到配置文件/PostgreSQL/8.x/data/postgresql.conf。修改CONNECTIONS AND AUTHENTICATION项将#listen_addr

coolmurder的专栏 2749

如何在IPv4下访问IPv6网络

一、Ubuntu系统 方法一:安装 miredo 包: # sudo apt-get install miredo # /sbin/ifconfig 看到 teredo 这个虚拟网卡就可以用它访问 ipv6 了:现在应该可以访问http://ipv6.google.com和六维空间http://bt.neu6.edu.cn/ 方法二、用隧道客户端软件mired...

weixin_34095889的博客 1万+

使用HttpURLConnection访问网络

connection [kəˈnɛkʃən]  连接HttpURLConnection 用于发送或接收数据Android客户端访问网络发送HTTP请求的方式一般有两种:HttpURLConnection和HttpClient。HttpURLConnection是java的标准类,HttpClient是一个开源项目。但是最新版的android sdk(6.0)已经移除了HttpClient库的支持。...

任重道远 2865

计算机无法访问网络位置,不能访问网络位置,详细教您怎么解决

如今,我们上网的时间越来越多,无论是用手机还是电脑。所以每天所要点击的网址也很多。但是有的时候,在网上访问共享资源的时候,系统会出现“不能访问网络位置”等网络提示。对于出现这样的问题,小编在这里给出自己所知道的解决办法。现在,“不能访问网络位置”这样的提示字样出现的几率很大,出现的场景也各不相同。在看文章,看视频,或者查找一些资料的时候,都有可能会出现访问不了网络位置的问题,这让我们大部分的人感到...

weixin_42510053的博客 1万+

阿里云Milvus网络访问与安全设置

本文介绍阿里云Milvus网络访问的类型划分及设置方法,旨在指导您安全且高效地设置网络环境。

1811
上一篇: 访问目录和文件
下一篇: Objective-C 入门
datacloud
博客等级 码龄15年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值