Java Socket编程(四)

怎么写测试用例? 带着问题学习是最高效的学习方法。 因此,在介绍如何编写测试用例之前,先看一个软件系统登录功能的测试(如下截图所示): 要做这个登录页面的测试用例,你会从哪些方面思考进行测试呢? 看似简单的页面功能能够设计多少条测试用例完成较全面的测试呢?10条以内?20条?....... 那么在给出上述答案之前,先带大家熟悉一下什么是测试用例?测试用例有什么作用? 然后在结合上述抛出的案例抛砖引玉一起讨论如何编写测试用例? 下面就是此文目录截图: 一、什么是测试用例 测试用例:为了特定的目的(证明软件 阅读详情

重复和并发服务器
这个应用程序被当作一个重复的服务器.因为它只有在处理完一个进程以后才会接受另一
个连接.更多的复杂服务器是并发的.它为每一个请求分配一个线程,而不是来一个处理一
个.所以看起来它在同时处理多人请求.所有的商业的服务器都是并发的服务器.
Java数据报类
不像面向连接的类,数据报的客户端和服务器端的类在表面上是一样的.下面的程序建立
了一个客户和服务器商的数据报sockets:
DatagramSocket serverSocket = new DatagramSocket( 4545 );
DatagramSocket clientSocket = new DatagramSocket();
服务器用参数4545来指定端口号,由于客户端将要呼叫服务器,客户端可以利用可利用的
端口.如果省略第二个参数,程序会让操作系统分配一个可用的端口.客户端可以请求一个
指定的端口,但是如果其它的应用程序已经绑定到这个端口之上,请求将会失败.如果你的
意图不是作为一个服务器,最好不要指定端口.
由于流不能由交谈得到,那么我么如何与一个数据报Socket进行对话.答案在于数据报类
.
接收数据报
DatagramPacket类是用来通过DatagramSocket类接收和发送数据的类.packet类包括了连
接信息和数据.就如前面所说的一样,数据报是自身独立的传输单元.DatagramPacket类压
缩了这些单元.下面的程序表示了用一个数据报socket来接收数据:
DatagramPacket packet = new DatagramPacket(new byte[512], 512); clientSocket
.receive(packet);
clientSocket.receive(packet);
packet的构建器需要知道将得到的数据放在哪儿.一个512字节的缓存被建立并且作为构
建器的第二个参数.每二个构建器参数是缓存的大小.就像ServerSocket类的accept()方
法一样,receive()方法在数据可用之前将会阻塞.
发送数据报
发送数据报是非常地简单地,所有需要的只是一个地址.地址是由InetAddress类来建立的
.这个类没有公共的构建器,但是它有几个static的方法,可以用来建立这个类的实例.下
面的列表列出了建立InetAddress类的实例的方法:
Public InetAddress Creation Methods
InetAddress getByName(String host);
InetAddress[] getAllByName(String host);
InetAddress getLocalHost();
得到本地主机的地址是非常地有用的,只有前面两个方法是用来发送数据包的.getByNam
e()和getAllByName()需要目的主机的地址.第一个方法仅仅只是返回第一个符合条件的
东西.第二个方法是必须的,因为一台计算机可能有多个地址.在这种情况下,这台计算机
被称为multi-homed.
所有的建立的方法都被标记为static.它们必须像下面这样得到调用:
InetAddress addr1 = InetAddress.getByName("merlin");
InetAddress addr2[] = InetAddress.getAllByName("merlin");
InetAddress addr3 = InetAddress.getLocalHost();

重复和并发服务器
所有的这些调用都可以掷出一个UnknownHostException违例.如果一台计算机没有连接上
DNS服务器,或者主机的确没有找到,这个违例就会被掷出.如果一台计算机没有一个激活
的TCP/IP配置,getLocalHost()也为失败并掷出一个违例.
一旦一个地址被确定了,数据报就可以被送出了.下面的程序传输了一个字符串给目的so
cket:
String toSend = "This is the data to send!");
byte[] sendbuf = new byte[ toSend.length() ];
toSend.getBytes( 0, toSend.length(), sendbuf, 0 );
DatagramPacket sendPacket = new DatagramPacket( sendbuf, sendbuf.length,
addr, port);
clientSocket.send( sendPacket );
首先,字符串必须被转换成一个字节数组.然后,一个新的DatagramPacket实例必须被建立
.注意构建器的最后两个参数.因为要发送一个包,所以地址和端口必须被给定.一个appl
et可能可以知道它的服务器的地址,但是服务器如何知道它的客户机的地址呢.当任何一
个包被收到后,返回的地址和端口会被解压出来,并通过getAddress()和getPort()方法得
到.这就是一个服务器如何回应一个客户端的包:
DatagramPacket sendPacket = new DatagramPacket( sendbuf, sendbuf.length,
recvPacket.getAddress(), recvPacket.getPort() );
serverSocket.send( sendPacket );
不像面向连接的操作,数据报服务器服务器其实比数据报客户端更简单:
数据报服务器
一个数据报服务器的基本步骤:
1.在一个指定的端口上建立一个数据报socket.
2.用receive方法等待进来的包.
3.用特定的协议来回应收到的包.
4.回到第二步或继续第二步.
5.关闭数据报socket.
列表9.3演示了一人简单的数据报回应服务器.它将回应它收到的包.
列表9.3.一个简单的数据报回应服务器
import java.io.*;
import java.net.*;
public class SimpleDatagramServer
{
public static void main(String[] args)
{
DatagramSocket socket = null;
DatagramPacket recvPacket, sendPacket;
try
{
socket = new DatagramSocket(4545);
while (socket != null)
{
recvPacket= new DatagramPacket(new byte[512], 512);
socket.receive(recvPacket);
sendPacket = new DatagramPacket(
recvPacket.getData(), recvPacket.getLength(),
recvPacket.getAddress(), recvPacket.getPort() );
socket.send( sendPacket );
}
}
catch (SocketException se)
{
System.out.println("Error in SimpleDatagramServer: " + se);
}
catch (IOException ioe)
{
System.out.println("Error in SimpleDatagramServer: " + ioe);

关于怎么写好测试用例 关于怎么写好测试用例,本文重点整理测试用例的方法和一些常见的测试用例、测试点。首先要理解需求,其次才是你的测试设计技术。 阅读详情

相关推荐

怎么写测试用例

怎么才能写出更符合产品的测试用例?什么样的用例才是好的用例?

AnnTsai的博客 5864

测试用例应该怎么写

针对一个功能设计测试用例,总是习惯性的回答:根据PRD来写呗,PRD怎么说我就怎么写,慢慢地将自己变成只会复制、粘贴的工具人。在他们眼里,做测试和进场打螺丝没有任何区别!

程序员小杨哥的博客 2万+

Fleury算法寻找欧拉回路(mtlab代码详解)

【代码】Fleury算法寻找欧拉回路(mtlab代码详解)

m0_63449998的博客 1297

测试用例是什么?怎么写?不会测试用例的看过来,三分钟教会你

前言 今天笔者想和大家来聊聊测试用例,这篇文章主要是想要写给测试小伙伴们的,因为我发现还是有很多小伙伴在遇到写测试用例的时候无从下手,我就想和大家简单的聊聊,这篇文章主要是针对功能测试的哟。 ​在这篇文章的后面笔者给大家准备一份惊喜哟 一、什么是测试用例? 测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。 通俗的讲:就是把我们测试系统的操作步骤按照一定的格式用文字描述出来。 二、写测试用例有什么好处? 1、理清思路,避

qishuzdh的博客 3万+

基于深度视觉实现机械臂对目标的识别与定位

Marker ID 和 Marker size 自选,在 launch 文件中做相应的修改(本教程演示使用 Marker ID:582,Marker size:30mm)根据相机和机械臂的安装方式不同,手眼标定分为眼在手上和眼在手外两种方式,双臂机器人的相机和机械臂基座的相对位置固定,所以应该采用眼在手外的手眼标定方式。后续的视觉引导机械臂抓取测试实验基于本实验实现,通过视觉引导右臂完成抓取目标物,所以默认已使用机械臂右臂和相机完成了手眼标定。文件,根据打印的marker 标签,需要配置。

realman_Rop的博客 3768

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

qq_37835727的博客 7115

测试用例要如何写

1、测试点与测试用例 2、测试用例设计流程 3、编写测试用例 4、测试用例评估 5、跟踪测试用例执行情况

主要分享测试的学习资源,帮助快速了解测试行业,帮助想转行、进阶、小白成长为高级测试工程师。 2万+

STM32CubeMX之SDIO+FatFS读写SD卡

“SD卡/TF卡的读写是嵌入式系统中常用的功能。而SD卡的本质是一种flash存储器,通过单片机可以直接读写,但若要被电脑识别,则需要文件系统的支持。本篇文章主要介绍通过单片机的SDIO...

zhang062061的专栏 1898

测试用例是什么?怎么写?不会测试用例的看过来,

今天笔者想和大家来聊聊测试用例,这篇文章主要是想要写给测试小伙伴们的,因为我发现还是有很多小伙伴在遇到写测试用例的时候无从下手,我就想和大家简单的聊聊,这篇文章主要是针对功能测试的哟。

jiegeniuboyi的博客 5143

Cloud Connector RFC 访问控制深度实践:为 SAP BTP ABAP environment 打通安全、可控的远程连接

本文是一份面向企业ABAP团队与平台工程团队的Cloud Connector RFC访问控制配置指南。文章详细介绍了虚拟主机/实例号、负载均衡、资源白名单等核心概念,并提供了从零开始的配置流程。主要内容包括:通过Cloud Connector建立安全隧道的价值(零暴露、最小权限)、两种连接类型(无负载均衡/带负载均衡)的配置方法、资源白名单设置技巧,以及两个典型应用场景(Custom Code Migration远程检查与BAPI调用)的实操案例。指南基于SAP官方文档,包含落地经验与避坑建议,可帮助团队快

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 146

【DRAM存储器六十六】DDR5介绍--训练相关之CA/CS Training

详述DDR5 CA/CS training过程细节

highman110的博客 200

uat测试用例怎么写_写好测试用例,能让你测试效率提升40%以上

有人知道怎么三连吗?在线等挺急的聊骚几句很多人不知道写测试用例有什么用,而仅仅是像工具人一样,在每次提测之前,把测试用例照着需求文档抄一遍,仿佛像是走个过场。开发提测之后,就照着测试用例点点点,可能一天就走完用例了,开发代码写得真好,测试用例执行完毕都没有测出bug,然后美其名曰:测试完了,达到上线标准。测完之后,测试用例毫无价值,像随手仍垃圾一样,随地保存,终于无迹可寻。在他们眼里,从...

weixin_39620334的博客 3269

YOLOv5改进系列(4)——添加ECA注意力机制

手把手教你在YOLOv5中加入ECA注意力机制,文内含两种方法,小白也能看懂!

路人贾的博客 8547

如何写好测试用例

经历过校招或社招的测试同学,都会被问到测试用例的设计、使用方法,以及用例的重要性。大概了解过测试行业或者有一些测试基础的同学面试时能很好的回答上来,设计用例的方法,但是给一个真实场景需要简单编写测试用例的时候,往往就暴露了设计用例的短板。再进阶一些的测试同学,会很疑惑,测试用例有什么用呢?每次提测前,把测试用例照着需求文档抄写一遍,走个过场?提测后,照着用例点点点,执行完毕后没有测出任何bug,达到了上线状态?上线后,测试用例毫无价值,用完弃之,最后线上出现bug,无迹可寻。

2301_79535733的博客 804

2025年5月架构设计师论文真题回顾,附写作技巧、所涉知识点及参考范文(三)

本文主要回顾2025年上半年(2025-5-24)系统架构设计师考试下午论文的题目,同时附带写作技巧、所涉知识点及参考范文。试题三:多模型数据库及应用。

一几文的编程学习笔记。 631

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

不会写测试用例!写测试用例需要注意什么?

说到测试用例,但凡是软件测试从业人员,都不会陌生。但对于测试新手来说,测试用例仍旧有遗漏,或者写不好的时候。那么,究竟应该如何写好测试用例呢?今天就来针对性的聊聊这个话题。 在分析如何写测试用例前,有一些关键性内容是我们一定要注意到的。 >>测试前: 1)对测试目的有一个清晰的认知 无论是对任何软件或是模块,编写测试用例前,一定要弄清原始需求。最好能与提出测试需求的人,有一次比较清晰的交流,这样可以避免测试遗漏点。 2)熟悉产品的功能测试点 编写测试用例,一定要覆盖所有需求点,这是我们最基本..

测试萌萌 4472

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【软件测试】(四)测试用例怎么写

文章目录一、测试用例基本要素1. 评价好的测试用例的标准2. 根据需求写测试用例3. 测试用例的设计方法3.1 基于需求进行测试用例的设计3.2 具体的设计用例的方法3.2.1 等价类3.2.2 边界值3.2.3 错误猜测法3.2.4 场景设计法3.2.5 因果图3.2.6 正交设计法 一、测试用例基本要素 之前文章提到过,测试用例是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。 1. 评价好的测试用例的标准 对比好坏用例的评价标准: (1)用例

m0_55916917的博客 3815

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

如何写好测试用例?

随着版本的不断迭代,我们的黑盒测试用例数会随之增多,当达到一定的规模之后日常管理的成本与消耗就会变得越来越大,除了定期对已有的测试用例集做瘦身、转化(删除无效用例,已稳定的功能相关用例可转化为自动化测试用例)之外,我们在设计用例之初就应该本着高效的理念,遵循上面几点所说的来进行处理,非必要时绝不进行全量设计,哪怕是靠近全量的大范围覆盖测试用例设计。随着时间的累积,你除了测试岗位的经验之外,你也获得了另外一种核心竞争力,那就是你的思维已经和其他人变得不同,你是积极的,独立的,不善于妥协的。

huace3740的博客 740

为什么要写测试用例,测试用例写给谁看?

为什么要编写,测试用例写给谁看”,这个问题看似简单,但却涵盖了一系列复杂的考虑因素,并不太好回答。好,现在我们开始。

OKCRoss的博客 1181
上一篇: Java Socket编程(三)
下一篇: Java Socket编程(五)
masterall
博客等级 码龄22年 17粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值