swing(三)----一个简单的聊天程序

服务器端代码:

package com.cw.threadtest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatServer {

/**
* @param args
*/
public static void main(String[] args) {
ServerSocket ss=null;
try {
ss = new ServerSocket(9100);
} catch (IOException e) {
e.printStackTrace();
}
List list = new ArrayList();
while(true){
try {
Socket s = ss.accept();
list.add(s);
Thread t = new ChatServerThread(s,list);
t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
class ChatServerThread extends Thread{
Socket socket ;
List list;
BufferedReader in ;
public ChatServerThread(Socket socket, List list) {
super();
this.socket = socket;
this.list = list;
}
@Override
public void run() {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true){
String text = in.readLine();
if (text==null)break;
for(int i=0;i<list.size();i++){
Socket socket2 = (Socket) list.get(i);
PrintWriter out = new PrintWriter(socket2.getOutputStream());
out.println(text);
out.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}finally{
list.remove(socket);
}
}
}

客户端

package com.cw.threadtest;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ChatClient {
JFrame frame ;
JTextField jtf ;
JTextArea jta;
BufferedReader in ;
PrintWriter out;

public ChatClient() {
frame = new JFrame("");
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jtf = new JTextField();
jta = new JTextArea();
frame.add(jtf,"South");
frame.add(new JScrollPane(jta));
jta.setEditable(false);
frame.setVisible(true);
Socket s;
try {
s =new Socket("192.168.1.11",9100);
out = new PrintWriter(s.getOutputStream());
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
jtf.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent arg0) {

String text = jtf.getText();
jtf.setText("");
out.println(text);
out.flush();
}


});
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void receiveText(){
while(true){
try {
String text = in.readLine();
jta.append(text+"\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ChatClient cc = new ChatClient();
cc.receiveText();

}

}
使用javaSwing搭建一个简单的聊天室 这个是因为帮朋友做作业记录一下,现场学习嗄,都忘了。好了不多说了。 1、首先得知道Swing,Swing是一个新型的java窗口工具(还是那么Love Orange W,哈哈哈) 2、聊天室怎么少得了Socket(套接字) 以上就是两个窗口聊天的主要用到底工具(功能) 1、聊天室多人聊天的,所以我们会以客户端和服务端两端就够了 2、我们开始写服务端代码,其实服务端和客户端代码都是一... 阅读详情

相关推荐

用Java写一个带界面的聊天程序

Java编程实践 用Java写一个带界面的网络聊天程序 基本实现思路: 首先得用Java Swing 编程写一个聊天界面,该界面需要包含以下元素 带滚轮的文本区域(显示聊天记录) 待输入的文本区域(输入聊天内容) 发送按钮 聊天界面主要的就这三大组件 实现步骤,用一个JScrollPane中间层容器来装一个文本框原子组件,该文本框设置为不可编辑,还要定义一个JPanel中间容器来装两个原子组件Button和JTextField,就是我们的输入文本框和发送按钮,然后再给Button和JTextField注

jump_into_zehe的博客 3726

【JavaSwing仿微信电脑版本】主界面实现

Java有一些主流的GUI框架,包括AWT,Swing、JavaFX等。AWT功能比较简易,JavaFx上手比较麻烦,而Swing是Java提供的轻量级的GUI框架,使用简单,上手也比较容易。Swing框架提供了各种各样的类,用于创建不同类型的GUI组件和应用程序,使用Swing库可以使用图片,文本,输入框,列表等。

程序开发 3878

Java Socket实现多人聊天室---swing做UI

今天翻硬盘的workspace发现一个Java Socket实现多人聊天室的源码,不记得是什么时候的事情了,貌似不是我写的。但写得还不错,   至少算个有模有样的聊天室工具。我简单的修改了一下,拿出来跟大家分享一下,仅供参考。。。            界面是用swing

宇强的一亩三分地 10万+

java实现聊天室(javaSwing+GUI)

1、javaSwing编写的聊天室,使用socket通信,基于TCP/IP协议。实现了私聊和群聊功能,不使用MySQL。2、编写和测试环境:JDK1.8。

浮生~的博客 1万+

仿QQ聊天软件(登录界面、好友界面、聊天界面)-Java(Swing、Socket)

主要运用swing和serversocket、socket写的仿QQ聊天室,深入学习并运用了swing相关组件和socket通信

yexiann的博客 9564

java多线程聊天室(使用swing)

java多线程聊天室 第一次写博客,有不妥之处请指正 使用swing实现的java多线程聊天室 我的代码结构 Chat ClientUI.java ConnectUI.java HelpUI.java PortConfig.java ServerUI.java User.java UserConfig.java 放一下我写的代码吧 借鉴了前辈的内容,自己又改了改,初学,大二,MVC模式还...

Haomua的博客 2385

Java GUI编程

GUI(Graphical User Interface)即图形用户界面,它能够使应用程序看上去更加友好。

qq_55674489的博客 4300

UDP的点对点聊天程序(swing界面)

点对点聊天的程序(swing界面) 主要代码 客户端 new Thread() { public void run() { try { //创建客户端的套接字 Socket socket=new Socket("localhost",Integer.parseInt(textField_2. getText())); //获取socket通道的输入流(输出流实现读取数据一行一行的读写 //InputStream in=socket.getInputStream();

Ln的博客 883

JavaSwing实现网络聊天程序

(1+r)^n,r 代表你正在做的事,n 代表时间,只要 r 为正,即你在做正确的事,时间就会为你带来奇迹。

这里是菠萝味菠萝啤的博客 1504

研一小白投稿SCI:Applied Intelligence从提交到Under Review的保姆级避坑指南

本文为研一学生提供Applied Intelligence期刊投稿的详细指南,涵盖格式校验、状态解析及审稿回应策略。特别强调声明文件、LaTeX模板的常见错误及应对方法,帮助新手避开高频踩坑点,提升投稿成功率。

weixin_29230805的博客 494

细说STM32单片机SPI-Flash芯片的FatFS移植及其应用实例详解

本文以开发板上的SPI-Flash芯片W25Q16为媒介详细介绍CubeMX中FatFS各个参数的意义和设置,分析生成的代码中FatFS各个文件的作用和关联,完成针对W25Q16的硬件访问层的移植。继续使用旺宝红龙开发板STM32F407ZGT6 KITV1.0。

wenchm的博客 1640

Java Swing编写udp数据传输的聊天程序demo

Java Swing编写udp数据传输的demo 事情是这个样子的,那天上软件工程课,老师和我们说,让我们一个星期内编写出一个udp进行数据传输的聊天程序,高级软件工程那本教科书上有响应的demo,但是那个代码是用VB写的,考古呢!!我就想着怎么用java来写一个,所以就有了以下内容了。 首先给大家看看作品演示 零、如果你想用视频教学的话,我录了一个视频可以看这里 点这里BIlibli直达l 一、项目需求 1.使用UDP 2.可视化 3.可以传输文本,语音 二、项目准备 0.下载jdk安装配置环境

GIOPPL的博客 2465

Java swing实现简单的C/S聊天及文件传输系统

很久没写博客了,这个本为课程设计,忙完了便抽空出来与大家分享一下,以便指正错误。 1、设计一个简单的聊天室程序。采用客户/服务器模式,分为客户端程序和服务器端程序。由于服务器只能支持一个客户,实际上是一个点对点通信的程序。客户端程序和服务器程序通过网络交换聊天字符串内容,并在窗口的列表框中显示。同时,实现了文件传输系统。 2、程序主界面(包含服务器端和客户端)。 3、先后点击

Elvis. 8846

国产FPGA开发实战:紫光同创编程软件中的约束文件详解与常见问题

本文详细解析了紫光同创FPGA编程软件中约束文件的关键配置技巧与常见问题。通过基础架构解析、时钟约束实践、物理约束调控及典型问题排查指南,帮助开发者高效掌握国产FPGA开发中的约束文件应用,提升开发效率与设计稳定性。

gin88的博客 909

大漠多线程增强版:解决窗口消失、坐标错乱与识别卡死

多线程环境下窗口自动化面临的核心挑战,本质是GDI资源非线程安全、HWND生命周期失控及图像引擎状态污染三大底层问题。Windows GUI编程中,跨线程共享hDC、缓存失效的窗口句柄、OpenCV静态Mat等设计缺陷,导致FindPic失败、GetCursorPos异常、坐标跳变等典型故障。本方案通过线程局部存储(TLS)重构资源生命周期、WinEventHook+心跳探测构建实时窗口状态链、ABI对齐的多语言内存契约,实现稳定低延迟的并发UI识别与控制。适用于游戏多开监控、电商RPA、后台UI状态采集等

weixin_30561177的博客 477

HiChat简单聊天程序

不积跬步无以至千里,不积小流无以成江海。 2869

RK3588平台开发系列讲解(USB篇)UAC初识

📢本篇将介绍RK3588平台`UAC`的配置使用。

内核笔记 3881

Java+Swing聊天室

Java+Swing聊天室一、系统介绍二、系统展示1.发送消息2.清屏三、系统实现四、其他1.其它系统2.获取源码 一、系统介绍 本系统实现了简单的聊天室功能:发送消息、清屏、退出系统。 二、系统展示 1.发送消息 2.清屏 三、系统实现 Client.java package cn.talk; import java.io.*; import java.net.*; import javax.swing.*; import javax.swing.table.*; import java.awt.*;

qq_33037637的博客 2926

工业激光器核心参数详解与选型实战:从理论到产线落地(五)

本文深入解析了脉冲激光加工的三大核心参数——脉宽、重复频率和脉冲能量的协同作用机制。通过公式推导和产线案例,揭示了参数设置对加工良率的关键影响:1. 脉宽决定热影响区大小,缩短脉宽可显著提升加工精度;2. 重复频率影响加工速度和热积累效应,需平衡效率与质量;3. 脉冲能量决定材料去除量,过大易导致加工缺陷。文中以ABS塑料打标、模具清洗和微孔钻孔为例,展示了参数优化如何将良率从65%提升至99%,并提供了不同应用场景的参数选型表和调试技巧,强调峰值功率比平均功率更具决定性作用。

weixin_44520581的博客 2421

29、机器人动力学中的欧拉 - 拉格朗日与哈密顿力学

本文深入探讨了机器人动力学中的欧拉-拉格朗日与哈密顿力学框架,涵盖向量流形上的辛结构、哈密顿方程的几何代数表述、泊松括号与积分不变量等核心概念。文章详细推导了机电系统中拉格朗日量与哈密顿量的构建方法,并结合牛顿-欧拉算法给出了局部哈密顿量和动量导数的迭代计算流程,适用于多关节机器人的动力学建模与控制设计。通过应用案例展示了理论在双关节机器人手臂中的实际运用,最后展望了其在优化控制、鲁棒性提升及智能融合方向的潜力。

perl8的博客 129

Java swing+网络编程 聊天室 简单示例

本不想使用swing这种过时技术,只不过学校实验要求。。。。 最后结果如图: 附上代码: import javax.swing.*; import javax.swing.border.EmptyBorder; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.io.*; import java.net.ServerS

wuqihawubito的博客 1994

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

用Java制作一个简单的QQ聊天界面

List item 用Java制作一个简单的QQ聊天界面 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功...

阿拉斯加头头的博客 8620

深度学习工具包 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")

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Swing+socket简单聊天程序

public class Server   implements ActionListener,Runnable {  JFrame jf =new JFrame("服务器启动");  JLabel jl=new JLabel("已启动服务器");    Socket so;  public Server(){   getFrame();  }  public void getF

vivian__1989的专栏 515

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

用Java Swing+NIO实现了一个C/S聊天室程序 支持群聊私聊功能

说明 这篇文章,或者说我实现的这个C/S模式的聊天项目,主要是为了方便大家学习Java NIO的。由于NIO的优势在于单机能处理的并发连接数高,因此特别适合用于聊天程序的服务端。 为什么使用Java Swing来做UI界面呢?虽然我们大家都知道,Java Swing现在已经过时了,并且Java的优势不在于图形界面,但我的需求并不需要漂亮美观的界面,并且Java语言实现C端界面的首选就是Java Swing了,只不过我只用了相对简单的UI组件和组件交互逻辑,但这也足够了。 效果演示 话不多说,先来演示一下我做

学无止境! 2294

基于Java Swing与TCP/IP协议完成的简单聊天程序

基于tcp协议与多线程完成的简单聊天程序:1、用户登录及登录验证:用户通过user表从数据库查询对应的id以及密码验证登录。 2、两两聊天功能:上线的用户可同时和多个用户两两聊天,实现的关键在于两个客户端之间的通信讯息由服务器来转发。(TCP协议) 3、建群及群聊功能:只简单实现了把消息转发给所有人的功能。 4、好友管理:能够显示好友列表,并能够添加、修改、删除好友。 5、在线、离线状态显示:通过在线好友列表,如果好友在线,则显示其头像和姓名,离线则不显示。 6、聊天记录管理:以.txt文本形式存储聊天

Dlihctcefrep的博客 2039
上一篇: swing(二)-----五个可执行jar文件
下一篇: poi之控制台生成xls
weiweichen
博客等级 码龄19年 10粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值