五、网络进阶

(五)Docker容器网络进阶:hosts配置与宿主机通信全解析 本文深入解析Docker容器网络进阶配置,重点介绍三种hosts文件配置方法(命令行参数、Docker Compose、Kubernetes hostAliases)及其适用场景,详细讲解host.docker.internal机制与host-gateway实战应用,并提供常见网络问题的解决方案与安全加固建议,帮助开发者高效管理容器网络。 阅读详情

Android基础网络第二天

1 post方式提交数据乱码的解决

一般在公司开发客户端和服务端的编码要保持一致。android端的默认编码是utf-8;

做url请求时需要对参数进行URLEncode编码.

URL url = new URL("http://192.168.13.83:8080/itheima74/servlet/LoginServlet?username="+URLEncoder.encode(username)+"&pwd="+URLEncoder.encode(password));

connection.setDoOutput(true);
connection.getOutputStream().write(parmes.getBytes());

2 get方式提交数据乱码解决

URLEncode

3 httpclient方式提交数据到服务器

HttpClient:

get方式:

// 使用HttpClient请求服务器将用户密码发送服务器验证
try{
    String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet?username="+URLEncoder.encode(username,"utf-8")+"&pwd="+URLEncoder.encode(password,"utf-8");
    // 1.创建一个httpClient对象
    HttpClient httpclient = new DefaultHttpClient();

    // 2.设置请求的方式
    HttpGet httpget = new HttpGet(path);
    // 3.执行一个http请求
    HttpResponse response = httpclient.execute(httpget);
    // 4.获取请求的状态码,
    StatusLine statusLine = response.getStatusLine();
    int code = statusLine.getStatusCode();

    // 5.判断状态码后获取内容
    if(code == 200){
        // 获取实体内容,中封装的有http请求返回的流信息
        HttpEntity entity = response.getEntity();
        InputStream inputStream = entity.getContent();
        // 将流信息转换成字符串
        String result = StreamUtils.streamToString(inputStream);

        Message msg = Message.obtain();
        msg.what = 1;
        msg.obj = result;
        handler.sendMessage(msg);
    }

}catch (Exception e) {
    e.printStackTrace();
}

post方式:

// 使用UrlConncetion请求服务器将用户密码发送服务器验证
try{
    String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet";
    // 1.创建一个httpclient对象
    HttpClient httpclient = new DefaultHttpClient();
    // 2.创建一个请求方式
    HttpPost httppost = new HttpPost(path);
    // 创建集合封装数据
    ArrayList<BasicNameValuePair> arrayList = new ArrayList<BasicNameValuePair>();
    BasicNameValuePair nameValuePair = new BasicNameValuePair("username",username);
    arrayList.add(nameValuePair);
    BasicNameValuePair nameValuePair1 = new BasicNameValuePair("pwd",password);
    arrayList.add(nameValuePair1);

    // 创建一个Entity
    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(arrayList, "utf-8");
    // 设置请求时的内容
    httppost.setEntity(entity);

    // 3.执行一个请求,返回一个response对象
    HttpResponse response = httpclient.execute(httppost);
    // 4.获取状态码
    int code = response.getStatusLine().getStatusCode();
    // 5.判断并获取内容
    if(code == 200){
        // 获取实体内容,中封装的有http请求返回的流信息
        HttpEntity entity1 = response.getEntity();
        InputStream inputStream = entity1.getContent();
        // 将流信息转换成字符串
        String result = StreamUtils.streamToString(inputStream);
        Message msg = Message.obtain();
        msg.what = 2;
        msg.obj = result;
        handler.sendMessage(msg);
    }
}catch (Exception e) {
    e.printStackTrace();
}

4开源项目get post 方式提交 (asyncHttpClient)

get方式:

public static void requestNetForGetLogin(final Context context,final Handler handler ,final String username, final String password) {
    // 使用HttpClient请求服务器将用户密码发送服务器验证
    try{
        String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet?username="+URLEncoder.encode(username,"utf-8")+"&pwd="+URLEncoder.encode(password,"utf-8");

        // 创建一个AsyncHttpClient对象
        AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
            asyncHttpClient.get(path, new AsyncHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                //statusCode:状态码    headers:头信息  responseBody:返回的内容,返回的实体
                //判断状态码
                if(statusCode == 200){
                    //获取结果
                    try {
                        String result = new String(responseBody,"utf-8");
                        Toast.makeText(context, result, 0).show();
                    } catch (UnsupportedEncodingException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();                
                    }
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                    System.out.println("...............onFailure");

                }
        });
    }catch (Exception e) {
        e.printStackTrace();
    }
}

post方式:

String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet";

AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("username", username);
params.put("pwd", password);

// url:   parmas:请求时携带的参数信息   responseHandler:是一个匿名内部类接受成功过失败
asyncHttpClient.post(path, params, new AsyncHttpResponseHandler() {

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
        // statusCode:状态码    headers:头信息  responseBody:返回的内容,返回的实体

        //判断状态码
        if(statusCode == 200){
            //获取结果
            try {
                String result = new String(responseBody,"utf-8");
                Toast.makeText(context, result, 0).show();
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

    }
});

5 文件上传的操作

使用第三方utils做文件上传。

public void fileupload(View v){
    try{
        EditText et_filepath = (EditText) findViewById(R.id.et_filepath);
        // 获取输入的文件地址
        String filepath = et_filepath.getText().toString().trim();

        // 使用开源Utils做上传操作
        AsyncHttpClient asyncHttpClient = new AsyncHttpClient();

        RequestParams params = new RequestParams();
        params.put("filename", new File(filepath));
        // url : 请求服务器的url
        asyncHttpClient.post("http://192.168.13.83:8080/itheima74/servlet/UploaderServlet", params, new AsyncHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                if(statusCode == 200){
                    Toast.makeText(MainActivity.this, "上传成功", 0).show();                
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

            }
        });

    }catch (Exception e) {
        e.printStackTrace();
    }
}

6 多线程加速下载的原理

1.线程越多下载越快?? 不是。与本地网络带宽, 服务器资源的带宽 有关

2.迅雷:3-5个。

多线程下载的步骤:

(1)要知道服务端资源的大小。

        通过URLConnection请求服务器url获取。
        UrlConnection.getContentLength();//资源的大小

(2)在本地创建一个与服务端资源同样大小的一个文件(占位)
//file : 文件; mode:文件的模式,rwd:直接写到底层设备,硬盘
RandomAccessFile randomfile =new RandomAccessFile(File file,String mode)

            randomfile.setLength(long size); // 创建一个文件和服务器资源一样大小

(3)要分配每个线程下载文件的开始位置和结束位置。

(4)开启线程去执行下载

通过UrlConnection下载部分资源。
注意:
    a.需要Range头,key:Range   value:bytes:0-499,urlconnection.setRequestPropety("Range","bytes:0-499")
    b.需要设置每个线程在本地文件的保存的开始位置
        RandomAccessFile randomfile =new RandomAccessFile(File file,String mode)
        randomfile.seek(int startPostion); // 本次线程下载保存的开始位置。

(5)要知道每个线程下载完毕。

7 javase 多线程下载

8 多线程断点续传实现

9 Android版本多线程下载

        安智: sdcard没有判断。uc

10 开源项目实现多线程下载 (xutils)

public void download(View v){
    EditText et_url = (EditText) findViewById(R.id.et_url);
    String url = et_url.getText().toString().trim();
    // 1.创建httpUtils对象
    HttpUtils httpUtils = new HttpUtils();
    // 2.调用download方法  url:下载的地址  target:下载的目录   callback:回调 
    httpUtils.download(url, "/sdcard/feiqiu/feiq.exe", new RequestCallBack<File>() {
        @Override
        public void onLoading(long total, long current, boolean isUploading) {
            System.out.println("total:"+total+";current:"+current);
            super.onLoading(total, current, isUploading);
        }
        @Override
        public void onSuccess(ResponseInfo<File> responseInfo) {
            System.out.println(responseInfo.result);
        }
        @Override
        public void onFailure(HttpException error, String msg) {
            // TODO Auto-generated method stub

        }
    });
}
社会网络分析(五) | 实战Gephi进阶布局,优化小说社群可视化 本文深入探讨了Gephi在社会网络分析中的进阶应用,特别是针对小说人物关系网络的可视化优化。通过解析Force Atlas 2、Yifan Hu等布局算法的参数调优技巧,结合《天龙八部》和《三体》等案例,展示了如何有效分离核心社群、突出关键人物关系,并平衡美学与功能性,为复杂网络分析提供实用解决方案。 阅读详情

相关推荐

Java基础中级进阶篇五之反射(详解篇二十七)

反射(Reflection) 是 Java 在运行时动态获取类的信息并操作对象的能力。通过反射,程序可以在运行时:核心 API 包:优点:缺点: 2. Class 类详解 2.1 获取 Class 对象的 6 种方式 方式 1:类名.class(编译期) 方式 2:对象.getClass()(运行时) 方式 3:Class.forName()(最常用) 方式 4:类加载器加载 方式 5:基本类型包装类的 TYPE 属性 方式 6:MethodHandle/反射方法返回值 2.2 Class 常

萧瑟余晖的博客 360

Android断点续传实践

最近公司项目要做断点续传,于是研究了一下。

折翅鵬的博客 482

ENVI5.6 Seamless Mosaic多景影像镶嵌色差问题

多景影像无缝镶嵌色差问题拟解决方法

Matchaya的博客 7705

JavaSE进阶(五)——网络编程概述

关于网络我们所熟知的就是互联网,最早的时候互联网并没有这么强大的功能,它的诞生仅仅是为了发邮件。互联网最开始仅支持文本传输,也就是说最早传输的数据只有文本。其实现在的互联网传输的数据也是属于文本数据,只是我们发现随着计算机普及,大家的需求越来越多,所以我们在单纯传输文本的基础上加入了**MIME**类型来区分提醒浏览器、计算机等按照对应类型解析传输的数据包。大家可能不知道怎么使用MIME类型,后续会说明,大家可以先了解一下各种数据资源在MIME类型中的对应关系。

老程的小白博客空间 538

深入STM32 USB OTG FS:从官方MSC例程到实战双存储设备移植全记录

本文详细解析了STM32 USB OTG FS在双存储设备开发中的实战应用,从协议栈底层机制到SD卡/SPI Flash同步挂载的实现。通过优化SDIO接口和SPI Flash驱动,结合USB MSC类的关键实现,提供了完整的解决方案和性能优化策略,适合嵌入式开发者参考。

weixin_28366475的博客 371

Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法

AX200 iwlwifi-cc-46.3cfab8da.0.tgz 无法下载网页出问题使用 其他方法来进行但是前提还是有网络。

chen20170325的博客 1039

Java进阶(五)网络编程

文章目录网络编程1.1计算机网络2. 网络模型2.1 OSI参考模型2.2 TCP/IP模型3. 通信协议3.1 TCP协议3.2 UDP协议3.3 IP协议3.4 Port端口4.TCP4.1 服务端4.2 客户端4.3 文件上传5.初识Tomcat6.UDP6.1 服务端6.2 客户端6.3 聊天案例6.4 多线程互发消息案例7.URL 网络编程 什么是网络? 由点和线构成,表示诸多对象间的互相联系。在生活当中,人际关系是一种网络,足球网是一种网络,蜘蛛网也是一种网络。 1.1计算机网络 什

TWoka的博客 210

【智能体】零代码实战:Coze多智能体协作开发全流程解析

本文详细解析了Coze平台的多智能体协作开发全流程,从入门指南到实战技巧,帮助用户零代码构建高效AI团队。通过模块化设计和专业分工,多智能体系统能显著提升任务处理速度和准确率,适用于客服、内容创作、教育培训等多个场景。文章还提供了性能优化和常见问题解决方案,助力开发者快速掌握Multi-Agent技术。

weixin_29239279的博客 336

(五)神经网络进阶(各种网络结构)

AlexNet(2012): (1)首次使用Relu (2)双GPU并行结构 (3)1,2,5卷积层后跟随max-pooling层 (4)两个全连接上使用了dropout(随机冻结)以降低过拟合 . . . VGGNet(2014): 2个3*3相当于1个5*5 2层比一层更多一次非线性变换 参数数量降低百分之28 。 。 。 网络结构 训练...

qq_36309884的博客 510

手把手教你学Simulink——基于电机驱动系统的场景实例:轮毂电机在电动汽车中的分布式驱动控制仿真

本文详细介绍了基于MATLAB/Simulink和Simscape Electrical的电动汽车轮毂电机分布式驱动控制系统建模方法。内容包括系统结构设计(轮毂电机、逆变器、控制器等模块)、完整的建模过程(从基础模块导入到车辆动力学建模)、控制器设计与转矩分配策略实现,以及仿真参数设置与结果分析。通过仿真验证了该分布式驱动系统在速度跟踪、转弯性能等方面的优异表现,为电动汽车驱动系统的研究与开发提供了有效的仿真验证平台。文中还提供了相关代码示例和资料推荐,是学习Simulink电机控制系统建模的实用指南。

MHD0815的博客 4914

灰质-白质组织对比(Gray-white matter tissue contrast,GWC)计算以及可视化

GWC是深层灰质与浅表白质(superficial white matter,SWM)之间T1加权信号强度的比值,已知髓鞘中的胆固醇是T1加权信号强度的主要影响因素,因此GWC大致反映了大脑皮层和浅表白质之间的髓鞘化差异。GWC代表灰白质交界处的模糊程度,较低的GWC表明灰质和白质交界处更相似和更模糊;较高的GWC表明灰白质分界更加清楚。据之前的研究报道,局灶性皮质发育不良、颞叶癫痫、帕金森病、强迫症、精神分裂症和自闭症谱系障碍中存在灰白质交界区GWC异常增高或降低。 灰质信号强度和白质信号强度采集的示意图

xxx 733

网络进阶学习:单臂路由(灵魂五问)

⭐单臂路由(Single Arm Routing)是一种网络架构,它在网络中加入了一个单独的路由器,用于处理网络中的所有流量。与传统的路由器不同,单臂路由器只有一个接口连接到网络中,因此它只能处理单个子网的流量。该架构通常用于大型企业网络或数据中心,以实现更高效的流量管理和更好的安全性。它可以通过网络地址转换(NAT)和端口转发来控制流量,并提供更好的网络性能和可扩展性。简单说,单臂路由就是网络架构问题的一种解决方案。

杜永康的博客 8498

【23】C++实战篇——C++报错:LNK2001:无法解析的外部符号 ,LNK2019: 无法解析的外部符号,原因分析及解决方法

该文分析了VS项目中出现的"无法解析的外部符号"LNK2001/LNK2019错误。问题表现为跨项目共享变量时,Projector项目无法解析Line项目中声明的外部变量ImgSavePath和ImgFormat。原因在于头文件声明了变量但未包含实现的源文件。解决方法是将getLine.cpp文件添加到Projector项目中。文章还总结了两种错误代码的区别:LNK2001通常对应变量缺失,LNK2019对应函数缺失。最后列出了具体的报错信息,包括无法解析的变量和函数符号。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2009

Python进阶(五):网络编程

网络编程 目的     实现不同程序或不同计算机之间的通信 实现 '''套接字Socket 服务端:新建scoket,绑定IP和端口,监听连接,接受连接 客户端:新建sokcet,连接服务器 socket(): 建立socket bind(): 绑定IP和端口 listen(): 监听连接,参数为最大挂起数量 accept(): 接受连接 send(): 发送数据,参数为字节数据 recv(): 接收数据,参数为一次所接收的最大数据量 ''' # server imp

WihauShe's Blogger 224

利用大模型和聚类算法找出 Excel 文件中重复或相似度高的数据,并使用 FastAPI 进行封装的详细方案

tokenizer将输入的文本列表texts转换为 PyTorch 张量,同时进行填充和截断操作,以确保所有输入具有相同的长度。对输入进行推理,得到模型的输出。对模型的最后一层隐藏状态求平均,得到每个文本的向量表示。.numpy()将 PyTorch 张量转换为 NumPy 数组。使用DBSCAN算法对文本向量进行聚类。eps是邻域半径,是形成核心点所需的最小样本数。fit方法对输入的向量进行聚类,并返回每个样本所属的簇标签。try:定义了一个 POST 请求的 API 路由,路径为。

AI的内部世界的博客 1069

android 蓝牙通讯demo

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

【网络进阶】Posix API与网络协议栈(五)

本博客主要介绍了Posix API和网络协议栈,详细解析了ARP协议、ICMP协议、IP协议、TCP协议及用户态网络协议栈的原理和实现。我们探讨了每个协议的基本功能、工作方式以及在TCP/IP网络协议栈中的位置。特别针对TCP协议,我们展示了它的握手和挥手过程,并阐述了如何使用Posix API实现TCP协议通信。最后,我们解析了TCP协议栈的实现细节。此博客旨在提供全面深入的网络协议栈知识,帮助开发者更好地理解网络编程。

Ricky的博客 1202

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

linux网络编程(五)epoll进阶

如果我们在第1步将rfd添加到epoll描述符的时候使用了EPOLLET标志,那么在第5步调用epoll_wait之后将有可能会挂起,因为剩余的数据还存在于文件的输入缓冲区内,而且数据发出端还在等待一个针对已经发出数据的反馈信息。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。但这并不是说每次read时都需要循环读,直到读到产生一个EAGAIN才认为此次事件处理完成,当read返回的读到的数据长度小于请求的数据长度时,就可以确定此时缓冲中已没有数据了,也就可以认为此事读事件已处理完成。

da.的博客 507

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Docker进阶与实践之五:Docker网络Libnetwork

一:简介 Libnetwork提出了容器网络模型CNM,定义了标准的API用于为容器配置网络,其底层可以适配各种网络驱动。CNM有三个重要概念:沙盒,Endpoint和网络。Libnetwork实现了五...

clmaykr95629的博客 234

【Python】Python进阶系列教程-- Python3 网络编程(五)

Python进阶系列教程-- Python3 正则表达式(一)Python进阶系列教程-- Python3 CGI编程(二)Python进阶系列教程-- Python3 MySQL - mysql-connector 驱动(三)Python进阶系列教程-- Python3 MySQL 数据库连接 - PyMySQL 驱动低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。

DreamSun的博客 1080

计算机网络进阶五:揭秘时延带宽积、RTT与丢包率

大家好!在上一篇文章中,我们聊了速率、带宽、吞吐量这些基础指标。今天,我们要把视野再拔高一点,深入探讨几个更“硬核”的性能指标。为什么看卫星直播时,主持人连线总会有几秒的尴尬停顿?为什么网络越卡,丢包率反而越高?时延带宽积、往返时间(RTT)、利用率和丢包率。这篇博客将带你彻底搞懂这些进阶概念,帮你从“会用网”进阶到“懂网络”!如果把传输链路看作一根管道传播时延:是管道的长度(数据跑完全程要多久)。带宽:是管道的横截面积(单位时间能塞进多少数据)。那么,时延带宽积就是这根管道的体积!RTT。

2301_79963518的博客 676

hualinux 进阶 1.6: centos8 docker CE 入门及安装(五) 使用网络

目录 一、外网访问容器 1.1参数-P -p 1.2映射到指定地址的任意端口 1.3查看映射端口配置 二、容器互联 2.1 说明 2.2 例子 附录一、docker的三种网络类型 1.1 none网络 1.2host 网络 1.3 bridge网络(默认) 本章最后一小节,讲docker使用简单的网络 一、外网访问容器 1.1参数-P -p 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或-p 参数来指定端口映射。 -P(大写):...

hualinux(阿华的linux) 534

深度学习(五)————卷积神经网络基础、leNet、卷积神经网络进阶

卷积神经网络基础 本节我们介绍卷积神经网络的基础概念,主要是卷积层和池化层,并解释填充、步幅、输入通道和输出通道的含义 我们介绍卷积层的两个超参数,即填充和步幅,它们可以对给定形状的输入和卷积核改变输出形状。 二维互相关运算 二维互相关(cross-correlation)运算的输入是一个二维输入数组和一个二维核(kernel)数组,输出也是一个二维数组,其中核数组通常称为卷积核或过滤器(...

qq_33589122的博客 762

Java学习记录(五):集合进阶、Stream流、方法引用、文件和IO、多线程以及网络编程

Java学习记录,包括集合、Stream API、文件和IO、多线程和网络变成等内容

stupidcunning的博客 677

网络安全最新JavaScript函数进阶知识(五)(1),三级缓存框架问题你都了解了吗

console.log(num) // 发现自己作用域没有,自己就是全局作用域,没有再上一级了,直接报错。// 这个 num 是一个全局作用域下的变量 在任何地方都可以使用。// 下面这个变量就是一个 fn 局部作用域内部的变量。// 只能在 fn 函数内部使用。

2401_84520118的博客 443

Python自动化运维之iptables和安全概述

1 安全知识体系 1.1 安全概述【了解】 1.1.1 安全现状 1.1.2 安全体系 底层硬件 买质量合格的设备 基础环境 版本合适,基本系统优化 应用环境 软件版本、配置参数、等 业务环境 项目和软件之间的配置、部门间的规范执行 运营维护 功能迭代方案、网站维护 1.1.3 安全措施 1.2 防火墙基础【了解】 1.2.1 防火墙简介 分类: 功能: 主机、网络 实现: 软件、硬件 细节: 包过滤、应用网关、应用状态、复合型

不一样的花朵的博客 870

2024年JavaScript函数进阶知识(五)(1),字节跳动8年老网络安全面试官经验谈

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。最后就是大家最关心的网络安全面试题板块。

2401_84281698的博客 851
上一篇: 四、网络基础
下一篇: 六、Intent和Activity详解
CoderLiLe
博客等级 码龄11年 2粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值