[网络编程]socket嵌套字的一些常用接口

目录

一、socket常用接口

1.sockaddr_in 

2.socket

3. bind

4.listen

5.accept

6.connect 

7.send 

8.sendto 

9.recv

10.recvfrom

11.close

二、 字节序之间的转换函数

1. inet_ntoa

2. inet_aton

3.inet_addr

4.inet_pton 

5.inet_ntop 

6.htons

7.ntohs


一、socket常用接口

1.sockaddr_in 

sockaddr_in 是 Unix 和 Linux 中用于表示 IPv4 地址和端口号的结构体。当创建一个 IPv4 套接字时,这个结构体通常用于 bind()connect()sendto()recvfrom() 等系统调用中,以指定或接收网络地址信息。

sockaddr_in 结构体的定义如下:

struct sockaddr_in {  
    short            sin_family;   // 地址族,对于 IPv4 通常是 AF_INET  
    unsigned short   sin_port;     // 端口号,网络字节序  
    struct in_addr   sin_addr;     // IPv4 地址  
    char             sin_zero[8];  // 未使用的填充字节,通常用零填充  
};
struct in_addr {  
    uint32_t       s_addr;    // 32 位的 IPv4 地址,网络字节序  
};

2.socket

功能

创建一个新的socket,返回一个新的socket文件描述符。

原型

#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

参数

  1. domain:指定了协议族(也称为协议域或地址族)。常见的值有:

    • AF_INET:IPv4 互联网协议。
    • AF_INET6:IPv6 互联网协议。
    • AF_UNIX(或 AF_LOCAL):本地进程间通信(Unix 域套接字)。
  2. type:指定了套接字类型。常见的值有:

    • SOCK_STREAM:提供有序的、可靠的、基于连接的字节流服务。它通常用于 TCP
    • SOCK_DGRAM:提供无连接的、不可靠的数据报服务。它通常用于 UDP
    • SOCK_RAW:提供原始网络访问,允许应用程序直接操作底层协议。
  3. protocol:通常设置为 0,表示选择默认的协议。在大多数情况下,对于给定的 domain 和 type,系统可以自动确定合适的协议。

返回值

成功时返回socket文件描述符,失败时返回-1,并设置全局变量 errno 以指示错误原因。

3. bind

功能

将一个套接字绑定到一个特定的地址上。

原型

#include <sys/types.h>  
#include <sys/socket.h>  
  
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数

  • sockfd:这是通过 socket() 函数创建的套接字文件描述符。

  • addr:这是一个指向 sockaddr 结构体的指针,该结构体包含了要绑定的地址信息。这个地址可以是 IP 地址和端口号的组合,或者对于 Unix 域套接字,它可能是一个文件路径。

  • addrlen:这是 addr 参数指向的地址结构体的长度。这允许函数知道 addr 指向的结构的类型(因为 sockaddr 是一个通用结构,有不同的变体,如 sockaddr_in 用于 IPv4,sockaddr_in6 用于 IPv6,sockaddr_un 用于 Unix 域套接字)。

返回值

  • 如果绑定成功,函数返回 0。
  • 如果绑定失败,函数返回 -1,并设置全局变量 errno 以指示错误原因。

4.listen

功能

使socket进入监听状态,等待连接。

原型

#include <sys/types.h>  
#include <sys/socket.h>  
  
int listen(int sockfd, int backlog);

参数

  • sockfd:这是你想要设置为监听模式的套接字的文件描述符。
  • backlog:这是一个整数值,指定了内核应该为相应套接字排队的最大连接数

返回值

成功时返回 0,失败时返回 -1 并设置全局错误变量 errno

5.accept

功能

当一个套接字处于监听模式(通过 listen 函数设置)时,它可以等待来自客户端的连接请求。一旦有客户端尝试连接,accept 函数就会被调用以接受这个连接,并返回一个新的套接字描述符,该描述符专门用于与这个特定客户端的通信

原型

#include <sys/types.h>  
#include <sys/socket.h>  
  
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数

  • sockfd:这是监听套接字(即调用过 listen 的套接字)的文件描述符。
  • addr:这是一个指向 sockaddr 结构的指针,该结构用于存储客户端的地址信息。如果不需要客户端的地址信息,这个参数可以设置为 NULL
  • addrlen:这是一个指向 socklen_t 类型变量的指针,该变量在调用 accept 之前应该设置为 addr 结构的大小。当 accept 返回时,它将包含实际存储在 addr 中的地址信息的大小。

返回值

成功时返回一个非负整数,这个整数是新套接字的文件描述符,用于与客户端通信。如果出错,则返回 -1 并设置全局错误变量 errno

6.connect 

功能

这个函数通常用在客户端程序中,以连接到服务器端的套接字。

原型

#include <sys/types.h>  
#include <sys/socket.h>  
  
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数

  • sockfd:这是客户端想要连接的套接字的文件描述符。这个套接字之前通常通过 socket 函数创建。
  • addr:这是一个指向 sockaddr 结构体的指针,该结构体包含了目标服务器的地址和端口信息。
  • addrlen:这是 addr 结构体的大小,以字节为单位。

返回值

成功时返回 0,表示连接已建立。如果连接失败,它将返回 -1 并设置全局错误变量 errno 以指示错误原因。

7.send 

功能

send 函数用于在已连接的套接字上发送数据。它通常用于 TCP 套接字,因为 TCP 套接字在发送数据之前需要先建立连接。

原型

#include <sys/types.h>  
#include <sys/socket.h>  
  
ssize_t send(int sockfd, const void *buf, size_t len, int flags);  

参数

  • sockfd:这是已连接套接字的文件描述符。这个套接字之前通常通过 socket 函数创建,并通过 connect 函数与远程主机建立了连接。
  • buf:这是一个指向要发送数据的缓冲区的指针。这个缓冲区包含了要发送的数据。
  • len:这是要发送数据的字节数。它指定了从 buf 指向的缓冲区中要发送的字节数。
  • flags:这是一组标志,用于修改发送操作的行为。这些标志可以影响发送操作的方式,例如是否应该进行非阻塞发送等。常见的标志包括 MSG_DONTWAIT(非阻塞发送)和 MSG_OOB(发送带外数据)。一般设为0,当flags设置为0时,send函数会以阻塞模式尝试发送整个请求的数据块,并等待直到数据被成功发送或发生错误。

返回值

 成功时返回发送的字节数,如果出错则返回 -1 并设置全局错误变量 errno

8.sendto 

功能

sendto 函数用于在无连接套接字上发送数据。它通常用于 UDP 套接字,因为 UDP 套接字不需要事先建立连接就可以发送数据。

原型

#include <sys/types.h>  
#include <sys/socket.h>  
  
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,  
               const struct sockaddr *dest_addr, socklen_t addrlen);

参数

  • ockfd:这是无连接套接字的文件描述符。
  • buf 和 len:与 send 函数中的参数相同,分别指向要发送的数据缓冲区和数据长度。
  • flags:与 send 函数中的标志参数相同。
  • dest_addr 和 addrlen:这两个参数指定了数据的目标地址和地址长度。对于 UDP 套接字,这通常是接收方的 IP 地址和端口号。

返回值

 成功时返回发送的字节数,如果出错则返回 -1 并设置全局错误变量 errno

9.recv

功能

recv 函数用于从已连接的套接字接收数据的函数。它通常与 send 函数配对使用,特别是在 TCP 套接字通信中。TCP 是一种面向连接(面向字节流)的协议,因此在使用 recv 之前,通常需要先通过 socket 和 connect(或 accept 在服务器端)函数建立连接。

原型

#include <sys/types.h>  
#include <sys/socket.h>  
  
ssize_t recv(int sockfd, void *buf, size_t len, int flags);  

参数

  • sockfd:这是已连接套接字的文件描述符。这个套接字应该是一个已经建立连接的 TCP 套接字。
  • buf:这是一个指向接收数据缓冲区的指针。这个缓冲区用于存储从套接字接收到的数据。
  • len:这是要接收数据的最大字节数。它指定了 buf 指向的缓冲区能够容纳的最大字节数。
  • flags:这是一组标志,用于修改接收操作的行为。虽然对于 recv 函数来说,这些标志的使用不像 send 函数那么频繁,但它们仍然可以用于一些特殊用途,例如是否应该进行峰值接收等。一般设为0,当 flags 设置为 0 时,recv 会以阻塞模式、顺序接收数据,并移除已读取的数据。这是大多数应用程序在处理 TCP 套接字接收数据时的期望行为。如果你需要改变这些默认行为(例如,使用非阻塞模式或只查看数据而不移除),你应该使用相应的 flags 值。

返回值

成功时返回接收的字节数,失败时返回-1, 并设置全局错误变量 errno。如果连接已关闭且没有数据可接收,则返回0。

10.recvfrom

功能

recvfrom 函数用于从指定的套接字接收数据,并可以获取发送方的地址信息。这个函数通常用于无连接的套接字类型,如 UDP,但也可以用于连接模式的套接字,如 TCP

原型

#include <sys/types.h>  
#include <sys/socket.h>  
  
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,  
                  struct sockaddr *src_addr, socklen_t *addrlen);

参数

  • int sockfd:要接收数据的套接字的文件描述符。
  • void *buf:指向一个缓冲区的指针,该缓冲区用于存储接收到的数据。
  • size_t len:指定 buf 缓冲区的大小,即最多可以接收的字节数。
  • int flags:指定接收操作的标志。一般设为0,表示进行默认是接收操作。
  • struct sockaddr *src_addr:指向一个 sockaddr 结构体的指针,用于存储发送方的地址信息。如果此参数为 NULL,则不获取发送方地址。
  • socklen_t *addrlen:指向一个整数变量的指针,用于存储 src_addr 结构体的实际大小。在调用 recvfrom 之前,应该将此变量设置为 src_addr 结构体的大小(通常使用 sizeof(struct sockaddr))。如果 src_addr 为 NULL,则此参数也应为 NULL。

返回值

 成功时返回接收的字节数,失败时返回-1, 并设置全局错误变量 errno。如果连接已关闭且没有数据可接收,则返回0。

11.close

功能

用于关闭一个已打开的文件描述符

原型

#include <unistd.h>  
  
int close(int fd);  

参数

  • fd 或 sockfd:要关闭的socket的文件描述符。

返回值

如果成功,close 返回 0。如果失败,返回 -1 并设置全局变量 errno 以指示错误原因。

二、 字节序之间的转换函数

1. inet_ntoa

功能

将网络字节序的IPv4地址转换成点分十进制的字符串形式。

原型

#include <arpa/inet.h>  
char *inet_ntoa(struct in_addr inaddr);

参数

  • inaddr:一个 struct in_addr 结构体,包含网络字节序的IPv4地址。

返回值

返回指向一个静态存储的点分十进制字符串的指针。如果传入的不是有效的IPv4地址,则结果不可预测。

2. inet_aton

功能

将一个点分十进制的IP地址字符串(例如"127.0.0.1")转换为一个32位的网络字节序的IP地址

原型

#include <arpa/inet.h>  
int inet_aton(const char *cp, struct in_addr *inp);

参数

  • cp 是一个指向以点分十进制表示的IP地址字符串的指针。
  • inp 是一个指向 struct in_addr 的指针,该结构体用于存储转换后的网络字节序的IP地址。

返回值

如果转换成功,inet_aton 函数返回非零值;如果输入地址不正确(例如,不是有效的IP地址),则返回零。此外,值得注意的是,使用 inet_aton 函数并没有错误码存放在 errno 中,所以其返回值通常被直接用来判断转换是否成功。

3.inet_addr

功能

一个点分十进制的IPv4地址转换为一个32位的无符号长整型数据(网络字节序)

原型

#include <arpa/inet.h>  
in_addr_t inet_addr(const char *cp);

参数

  • cp:指向点分十进制IPv4地址字符串的指针。

返回值

成功时返回网络字节序的IPv4地址,如果输入的不是有效的表示形式则返回 INADDR_NONE

4.inet_pton 

功能

将点分十进制的IP地址字符串转换为网络字节序的二进制形式。它支持IPv4和IPv6两种地址族。

原型

#include <arpa/inet.h>  
int inet_pton(int af, const char *src, void *dst);

参数

  • af:指定地址族,AF_INET 指定 IPv4 地址,AF_INET6 指定 IPv6 地址。
  • src:指向要转换的字符串地址的指针。
  • dst:指向存放网络字节序的二进制结果的地址的指针。

返回值

  • 如果成功将地址字符串转换为网络字节序整数,inet_pton 会返回 1。
  • 如果输入的地址字符串无效,它会返回 0。
  • 如果发生错误,它会返回 -1。

5.inet_ntop 

功能

它的主要作用是将网络字节序(大端序)的IPv4或IPv6地址转换成人类可读的字符串形式。这个函数特别适用于需要将IP地址的数字形式转换为文本格式的场景

原型

#include <arpa/inet.h>  
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

参数

  • af:地址族,指定了要转换的地址类型。可以是 AF_INET(表示IPv4)或 AF_INET6(表示IPv6)。
  • src:指向要转换的二进制地址的指针。这个地址应该是网络字节序的。
  • dst:指向存储转换后的字符串的缓冲区的指针。
  • sizedst 缓冲区的大小。这用于避免缓冲区溢出。

返回值

  • 如果转换成功,inet_ntop() 函数返回一个指向 dst 的指针,该指针指向转换后的字符串地址。
  • 如果发生错误(比如缓冲区太小无法存储转换后的字符串),则返回值为 NULL,并设置全局错误号 errno

6.htons

功能

将无符号短整形(16位)数值(端口号))从主机字节序转换为网络字节序

原型

#include <arpa/inet.h>  
uint16_t htons(uint16_t hostshort);

参数

  • hostshort参数是一个以主机字节序存储的无符号短整形数值

返回值

返回转换后的网络字节序的无符号短整形数值。

注意

htons函数仅处理16位数值的转换,对于32位数值的转换,应使用htonl(host to network long)函数。同时,对于从网络接收到的数据,需要使用ntohs(network to host short)函数进行相反的转换,即从网络字节序转换回主机字节序。

7.ntohs

功能

用于将16位无符号整数从网络字节序(大端)转换为主机字节序

原型

#include <arpa/inet.h>  
uint16_t ntohs(uint16_t netshort);

参数

  • netshort是要进行转换的16位无符号整数,以网络字节序表示

返回值

返回转换后的主机字节序的16位无符号整数。

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 历史 前言 I. C语言入门 1. 程序的基本概念 1. 程序和编程语言 2. 自然语言和形式语言 3. 程序的调试 4. 第一个程序 2. 常量、变量和表达式 1. 继续Hello World 2. 常量 3. 变量 4. 赋值 5. 表达式 6. 符类型与符编码 3. 简单函数 1. 数学函数 2. 自定义函数 3. 形参和实参 4. 全局变量、局部变量和作用域 4. 分支语句 1. if语句 2. if/else语句 3. 布尔代数 4. switch语句 5. 深入理解函数 1. return语句 2. 增量式开发 3. 递归 6. 循环语句 1. while语句 2. do/while语句 3. for语句 4. break和continue语句 5. 嵌套循环 6. goto语句和标号 7. 结构体 1. 复合类型与结构体 2. 数据抽象 3. 数据类型标志 4. 嵌套结构体 8. 数组 1. 数组的基本概念 2. 数组应用实例:统计随机数 3. 数组应用实例:直方图 4. 符串 5. 多维数组 9. 编码风格 1. 缩进和空白 2. 注释 3. 标识符命名 4. 函数 5. indent工具 10. gdb 1. 单步执行和跟踪函数调用 2. 断点 3. 观察点 4. 段错误 11. 排序与查找 1. 算法的概念 2. 插入排序 3. 算法的时间复杂度分析 4. 归并排序 5. 线性查找 6. 折半查找 12. 栈与队列 1. 数据结构的概念 2. 堆栈 3. 深度优先搜索 4. 队列与广度优先搜索 5. 环形队列 13. 本阶段总结 II. C语言本质 14. 计算机中数的表示 1. 为什么计算机用二进制计数 2. 不同进制之间的换算 3. 整数的加减运算 3.1. Sign and Magnitude表示法 3.2. 1's Complement表示法 3.3. 2's Complement表示法 3.4. 有符号数和无符号数 4. 浮点数 15. 数据类型详解 1. 整型 2. 浮点型 3. 类型转换 3.1. Integer Promotion 3.2. Usual Arithmetic Conversion 3.3. 由赋值产生的类型转换 3.4. 强制类型转换 3.5. 编译器如何处理类型转换 16. 运算符详解 1. 位运算 1.1. 按位与、或、异或、取反运算 1.2. 移位运算 1.3. 掩码 1.4. 异或运算的一些特性 2. 其它运算符 2.1. 复合赋值运算符 2.2. 条件运算符 2.3. 逗号运算符 2.4. sizeof运算符与typedef类型声明 3. Side Effect与Sequence Point 4. 运算符总结 17. 计算机体系结构基础 1. 内存与地址 2. CPU 3. 设备 4. MMU 5. Memory Hierarchy 18. x86汇编程序基础 1. 最简单的汇编程序 2. x86的寄存器 3. 第二个汇编程序 4. 寻址方式 5. ELF文件 5.1. 目标文件 5.2. 可执行文件 19. 汇编与C之间的关系 1. 函数调用 2. main函数和启动例程 3. 变量的存储布局 4. 结构体和联合体 5. C内联汇编 6. volatile限定符 20. 链接详解 1. 多目标文件的链接 2. 定义和声明 2.1. extern和static关键 2.2. 头文件 2.3. 定义和声明的详细规则 3. 静态库 4. 共享库 4.1. 编译、链接、运行 4.2. 动态链接的过程 4.3. 共享库的命名惯例 5. 虚拟内存管理 21. 预处理 1. 预处理的步骤 2. 宏定义 2.1. 函数式宏定义 2.2. 内联函数 2.3. #、##运算符和可变参数 2.4. 宏展开的步骤 3. 条件预处理指示 4. 其它预处理特性 22. Makefile基础 1. 基本规则 2. 隐含规则和模式规则 3. 变量 4. 自动处理头文件的依赖关系 5. 常用的make命令行选项 23. 指针 1. 指针的基本概念 2. 指针类型的参数和返回值 3. 指针与数组 4. 指针与const限定符 5. 指针与结构体 6. 指向指针的指针与指针数组 7. 指向数组的指针与多维数组 8. 函数类型和函数指针类型 9. 不完全类型和复杂声明 24. 函数接口 1. 本章的预备知识 1.1. strcpy与strncpy 1.2. malloc与free 2. 传入参数与传出参数 3. 两层指针的参数 4. 返回值是指针的情况 5. 回调函数 6. 可变参数 25. C标准库 1. 符串操作函数 1.1. 初始化符串 1.2. 取符串的长度 1.3. 拷贝符串 1.4. 连接符串 1.5. 比较符串 1.6. 搜索符串 1.7. 分割符串 2. 标准I/O库函数 2.1. 文件的基本概念 2.2. fopen/fclose 2.3. stdin/stdout/stderr 2.4. errno与perror函数 2.5. 以节为单位的I/O函数 2.6. 操作读写位置的函数 2.7. 以符串为单位的I/O函数 2.8. 以记录为单位的I/O函数 2.9. 格式化I/O函数 2.10. C标准库的I/O缓冲区 2.11. 本节综合练习 3. 数值符串转换函数 4. 分配内存的函数 26. 链表、二叉树和哈希表 1. 链表 1.1. 单链表 1.2. 双向链表 1.3. 静态链表 1.4. 本节综合练习 2. 二叉树 2.1. 二叉树的基本概念 2.2. 排序二叉树 3. 哈希表 27. 本阶段总结 III. Linux系统编程 28. 文件与I/O 1. 汇编程序的Hello world 2. C标准I/O库函数与Unbuffered I/O函数 3. open/close 4. read/write 5. lseek 6. fcntl 7. ioctl 8. mmap 29. 文件系统 1. 引言 2. ext2文件系统 2.1. 总体存储布局 2.2. 实例剖析 2.3. 数据块寻址 2.4. 文件和目录操作的系统函数 3. VFS 3.1. 内核数据结构 3.2. dup和dup2函数 30. 进程 1. 引言 2. 环境变量 3. 进程控制 3.1. fork函数 3.2. exec函数 3.3. wait和waitpid函数 4. 进程间通信 4.1. 管道 4.2. 其它IPC机制 5. 练习:实现简单的Shell 31. Shell脚本 1. Shell的历史 2. Shell如何执行命令 2.1. 执行交互式命令 2.2. 执行脚本 3. Shell的基本语法 3.1. 变量 3.2. 文件名代换(Globbing):* ? [] 3.3. 命令代换:`或 $() 3.4. 算术代换:$(()) 3.5. 转义符\ 3.6. 单引号 3.7. 双引号 4. bash启动脚本 4.1. 作为交互登录Shell启动,或者使用--login参数启动 4.2. 以交互非登录Shell启动 4.3. 非交互启动 4.4. 以sh命令启动 5. Shell脚本语法 5.1. 条件测试:test [ 5.2. if/then/elif/else/fi 5.3. case/esac 5.4. for/do/done 5.5. while/do/done 5.6. 位置参数和特殊变量 5.7. 函数 6. Shell脚本的调试方法 32. 正则表达式 1. 引言 2. 基本语法 3. sed 4. awk 5. 练习:在C语言中使用正则表达式 33. 信号 1. 信号的基本概念 2. 产生信号 2.1. 通过终端按键产生信号 2.2. 调用系统函数向进程发信号 2.3. 由软件条件产生信号 3. 阻塞信号 3.1. 信号在内核中的表示 3.2. 信号集操作函数 3.3. sigprocmask 3.4. sigpending 4. 捕捉信号 4.1. 内核如何实现信号的捕捉 4.2. sigaction 4.3. pause 4.4. 可重入函数 4.5. sig_atomic_t类型与volatile限定符 4.6. 竞态条件与sigsuspend函数 4.7. 关于SIGCHLD信号 34. 终端、作业控制与守护进程 1. 终端 1.1. 终端的基本概念 1.2. 终端登录过程 1.3. 网络登录过程 2. 作业控制 2.1. Session与进程组 2.2. 与作业控制有关的信号 3. 守护进程 35. 线程 1. 线程的概念 2. 线程控制 2.1. 创建线程 2.2. 终止线程 3. 线程间同步 3.1. mutex 3.2. Condition Variable 3.3. Semaphore 3.4. 其它线程间同步机制 4. 编程练习 36. TCP/IP协议基础 1. TCP/IP协议栈与数据包封装 2. 以太网(RFC 894)帧格式 3. ARP数据报格式 4. IP数据报格式 5. IP地址与路由 6. UDP段格式 7. TCP协议 7.1. 段格式 7.2. 通讯时序 7.3. 流量控制 37. socket编程 1. 预备知识 1.1. 网络节序 1.2. socket地址的数据类型及相关函数 2. 基于TCP协议的网络程序 2.1. 最简单的TCP网络程序 2.2. 错误处理与读写控制 2.3. 把client改为交互式输入 2.4. 使用fork并发处理多个client的请求 2.5. setsockopt 2.6. 使用select 3. 基于UDP协议的网络程序 4. UNIX Domain Socket IPC 5. 练习:实现简单的Web服务器 5.1. 基本HTTP协议 5.2. 执行CGI程序 A. 符编码 1. ASCII码 2. Unicode和UTF-8 3. 在Linux C编程中使用Unicode和UTF-8 B. GNU Free Documentation License Version 1.3, 3 November 2008 参考书目 索引
java面试试题 全面 准确 带答案 coreJava部分 8 1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 5、语句float f=1.3;编译能否通过? 8 6、short s1 = 1; s1 = s1 + 1;有什么错? 8 7、Java 有没有goto? 8 8、int 和Integer 有什么区别? 9 9、&和&&的区别? 9 10、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别? 9 11、heap 和stack 有什么区别? 9 12、Math.round(11.5) 等于多少? Math.round(-11.5)等于多少? 9 13、swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上? 9 14、编程题: 用最有效率的方法算出2 乘以8 等於几? 9 15、有没有length()这个方法? String 有没有length()这个方法? 9 16、在JAVA 中,如何跳出当前的多重嵌套循环? 9 17、构造器Constructor 是否可被override? 9 18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 9 19、是否可以继承String 类? 9 20、以下二条语句返回值为true 的有: 10 21、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 10 22、我们在web 应用开发过程中经常遇到输出某种编码的符,如iso8859-1等,如何输出一个某种编码的符串? 10 23、String 和StringBuffer 的区别? 10 24、String, StringBuffer StringBuilder 的区别。 10 25、Overload 和Override 的区别。Overloaded 的方法是否可以改变返回值的类型? 10 27、描述一下JVM 加载class 文件的原理机制? 10 28、char 型变量中能不能存贮一个中文汉?为什么? 10 29、abstract class 和interface 有什么区别? 10 30、Static Nested Class 和Inner Class 的不同? 11 31、java 中会存在内存泄漏吗,请简单描述。 11 32、abstract 的method 是否可同时是static,是否可同时是native,是否可同时是synchronized? 11 33、静态变量和实例变量的区别? 11 34、是否可以从一个static 方法内部发出对非static 方法的调用? 11 35、写clone()方法时,通常都有一行代码,是什么? 11 36、GC 是什么? 为什么要有GC? 11 37、垃圾回收的优点和原理。并考虑2 种回收机制。 11 38、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 12 39、String s=new String(“xyz”);创建了几个String Object? 12 40、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 12 41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以implements(实现)interface(接口)? 12 45、内部类可以引用他包含类的成员吗?有没有什么限制? 12 46、java 中实现多态的机制是什么? 12 47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的运行结果: 【基础】 13 52、关于内部类: 13 53、数据类型之间的转换: 14 54、符串操作:如何实现符串的反转及替换? 14 55、编码转换:怎样将GB2312 编码的符串转换为ISO-8859-1 编码的符串? 14 56、写一个函数,要求输入一个符串和一个符长度,对该符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么区别 16 63、ArrayList和Vector的区别 16 64、Collection 和 Collections的区别 17 65、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别 17 66、HashMap和Hashtable的区别 17 67、说出ArrayList,Vector, LinkedList的存储性能和特性 17 68、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 17 69、文件读写的基本类 17 70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket通信(tcp/udp区别及JAVA的实现方式) 18 76、什么是java序列化,如何实现java序列化? 18 77、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 18 78、abstract class Name { private String name; public abstract boolean isStupidName(String name) {}}这有何错误? 18 79、public class Something { void doSomething () { private String s = ""; int l = s.length(); } }有错吗? 18 80、abstract class Something { private abstract String doSomething ();}这好像没什么错吧? 18 81、public class Something { public int addOne(final int x) { return ++x; }}这个比较明显。 19 83、class Something { int i; public void doSomething() { System.out.println("i = " + i); }} 有什么错呢? 19 Hibernate部分 19 92、一般情况下,关系数据模型与对象模型之间有哪些匹配关系(A,B,C) 21 93、以下关于SessionFactory的说法哪些正确?(B,C) 21 94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、Hibernate是如何延迟加载? 22 98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101、如何优化Hibernate? 23 102、Struts工作机制?为什么要使用Struts? 23 103、Struts的validate框架是如何验证的? 24 104、说下Struts的设计模式 24 105、spring工作机制及为什么要用? 24 106、HttpSession session = request.getSession() 24 107、getParameter与 getAttribute的区别? 24 108、以下哪一个不是赋值符号? 25 109、以下哪个不是Collection的子接口? 25 110、.BufferedReader的父类是以下哪个? 25 112、div与span区别? 25 113、html的框架是什么? 25 114、alert怎样换行? 25 115、什么情况用HTML控件,什么情况用WEB控件,并比较两者差别 25 javaScript部分 25 116、JavaScript中的对象. 25 117、function的用法 26 118、对象的继承 27 119、this的用法 29 120、Array in JavaScript 29 121、jsp有哪些内置对象?作用分别是什么? 31 122、jsp有哪些动作?作用分别是什么? 31 123、JSP中动态INCLUDE与静态INCLUDE的区别? 31 124、两种跳转方式分别是什么?有什么区别? 31 125、如何执行一个线程安全的JSP? 31 126、JSP如何处理HTML FORM中的数据? 31 127、在JSP如何包含一个静态文件? 32 128、在JSP中如何使用注释? 32 129、在JSP中如何执行浏览重定向? 32 130、如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? 32 131、在JSP中如何设置COOKIE? 32 132、在JSP中如何删除一个COOKIE? 32 133、在一个JSP的请求处理中如何停止JSP的执行 33 134、在JSP中如何定义方法 33 135、在JSP中能发送EMAIL吗 34 136、在SERVLET中我能调用一个JSP错误页吗 34 137、APPLET和JSP如何通讯 35 138、JSP如何与EJB SessionBean通讯 35 139、当我使用一个结果集时,如何防止段为"null"的域显示在我的HTML输入文本域中? 35 140、如何中SERVLET或JSP下载一个文件(如:binary,text,executable)? 36 141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS? 36 145、<%@include file="abc.jsp"%>与<jsp:include page="abc.jsp"/>之间的差别? 36 146、JSP的缺点? 36 148、如何实现JSP的国际化? 36 150、如何在JSP中包括绝对路径文件? 使用URLConnection即可。 37 151、在servlets和JSP之间能共享session对象吗? 37 152、如何设置cookie在某一时间后过期? 37 153、如何获得当前的sessions数? 37 154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、对一个JSP页,如果多个客户端同时请求它,同步可能吗? 37 156、在jsp:useBean语法中使用beanName有何好处? 37 157、当我使用<jsp:forward>时,在浏览器的地址栏没有改变? 37 158、如何转换JSP 0.9版本的文件到JSP1.1? 37 160、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 38 161、AJAX的全称是什么? 介绍一下AJAX 38 162、Ajax主要包含了哪些技术? 38 163、主要的Ajax框架都有什么? 38 164、介绍一下XMLHttpRequest对象 38 165、AJAX应用和传统Web应用有什么不同? 38 166、如何用JQuery进行表单验证? 39 167、Prototype如何实现页面局部定时刷新? 40 168、Prototype如何为一个Ajax添加一个参数? 40 169、Ajax请求总共有多少种Callback? 41 170、Javascript如何发送一个Ajax请求? 41 171、AJAX都有哪些有点和缺点? 41 172、Ajax和javascript的区别? 41 Servlet部分 42 174、JAVA SERVLET API中forward() 与redirect()的区别? 42 178、如何现实servlet的单线程模式 42 179、页面间对象传递的方法 42 180、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 42 181、四种会话跟踪技术 42 182、Request对象的主要方法 43 183、我们在web应用开发过程中经常遇到输出某种编码的符,如iso8859-1等,如何输出一个某种编码的符串? 43 184、Servlet执行时一般实现哪几个方法? 44 185、getServletContext()和getServletConfig()的意思 44 186、Hashtable和HashMap 44 187、JAVA SERVLET API中forward() 与redirect()的区别? 44 189、Can a Java Thread be started from Servlet class, and what will be the implications? 45 190、What is HTTP Session tracking and why is it important? 45 191、What is session management, and how is it different from session tracking? 45 192、Can I use Hidden form field to track session? 45 194、In a architecture pattern like MVC, it is mandatory that Servlet should be the controller, why not JSP? 46 195、Why JSP is used as View part of MVC ? 46 196、Can a database connection pool be instantiated in init method of servlet instead of server connection pool? What will be the problem? 46 综合部分 46 197、Class.forName的作用?为什么要用? 47 198、Jdo是什么? 47 199、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 47 200、xml有哪些解析技术?区别是什么? 48 201、你在项目中用到了xml技术的哪些方面?如何实现的? 48 202、用jdom解析xml文件时如何解决中文问题?如何解析? 48 203、编程用JAVA解析XML的方式. 49 204、EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别? 51 205、EJB与JAVA BEAN的区别? 51 206、EJB的基本架构 51 207、MVC的各个部分都有那些技术来实现?如何实现? 52 208、J2EE是什么? 52 209、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 52 210、STRUTS的应用(如STRUTS架构) 52 211、开发中都用到了那些设计模式?用在什么场合? 52 212、UML方面 52 213、如何校验数型? 53 214、CORBA是什么?用途是什么? 53 215、写一个方法,实现符串的反转,如:输入abc,输出cba 53 216、数据类型之间的转换 53 217、如何取得年月日,小时分秒 53 218、如何取得从1970年到现在的毫秒数 53 219、如何格式化日期 53 220、文件和目录(I/O)操作 54 230、J2EE的优越性 54 231、Java语言的11个关键特性. 54 232、说出Servlet的生命周期,并说出Servlet和CGI的区别。 55 233、说出在JSP页面里是怎么分页的? 55 234、存储过程和函数的区别 55 235、事务是什么? 55 236、游标的作用?如何知道游标已经到了最后? 55 237、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 56 238、EJB容器提供的服务 56 239、EJB的角色和三个对象 56 240、EJB的几种类型 56 241、bean 实例的生命周期 56 242、激活机制 56 243、remote接口和home接口主要作用 56 244、客服端调用EJB对象的几个基本步骤 56 245、 如何给weblogic指定大小的内存? 56 246、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 57 247、如何启动时不需输入用户名与密码? 57 248、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 57 250、如何查看在weblogic中已经发布的EJB? 57 251、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置 57 252、在weblogic中发布ejb需涉及到哪些配置文件 57 253、EJB需直接实现它的业务接口或Home接口吗,请简述理由. 57 254、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别 57 255、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法 57 256、现在输入n个数,以逗号,分开; 58 257、金额转换,阿拉伯数的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 58 259、Spring和Struts的区别? 58 260、如何用Struts实现国际化? 58 261、如何实现struts的validator框架? 59 262、如何在struts中配置数据源在,什么文件?用什么标签?如何取出DataSource? 60 263、Struts框架如何取得消息资源文件中的信息? 60 264、Struts中如何基于validation.xml来启用客户端验证? 60 266、请你谈谈SSH整合 60 267、ActionForm bean的作用 61 268、Spring如何创建一个数据连接池 61 269、Spring如何配置一个bean来从JNDI得到DataSource 61 270、Bean的销毁 61 271、Spring如何获取Bean 61 272、Spring和Struts的区别? 62 273、什么是aop,aop的作用是什么? 62 275、依赖注入的方式有几种,各是什么? 62 276、spring中的核心类有那些,各有什么作用? 62 277、ApplicationContext的作用 63 278、如何实现资源管理 63 279、如何实现加入web框架中 63 280、如何实现事件处理 63 281、spring的ioc及di代表什么意思? 63 283、spring的配置的主要标签是什么?有什么作用? 64 284、spring与ejb2.0的事务管理比较的优缺点? 64 286、在spring中有几种事务管理,分别是什么? 64 287、在spring中如何配代码的事务管理? 65 288、在spring中如何配容器的事务管理,相关的类有那些? 65 289、如果spring与hibernate结合在一起可以不需要hibernate.cfg.xml文件是否正确? 65 290、spring+hibernate的配置文件中的主要类有那些?如何配置? 65 291、spring+hibernate的代码实现中,对于实现类一定继承于一个类是那一个,它有什么作用 66 292、如何配置spring+struts? 66 293、如何在web环境中配置applicationContext.xml文件? 66 294、BS与CS的联系与区别 66 295、Servlet的生命周期 68 296、如何现实Servlet的单线程模式 68 297、Servlet执行时一般实现哪几个方法? 68 298、j2ee常用的设计模式?说明工厂模式。 68 299、应用服务器与WEB SERVER的区别? 68 300、应用服务器有那些? 68 301、说出数据连接池的工作机制是什么? 68 302、页面间对象传递的方法 69 303、四种会话跟踪技术 69 304、J2EE 是技术还是平台还是框架? 69 305、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 69 306、启动一个线程是用run()还是start()? 69 307、线程的基本概念、线程的基本状态以及状态之间的关系 69 308、java 中有几种方法可以实现一个线程?用什么关键修饰同步方法? stop()和suspend()方法为何不推荐使用? 70 309、JSP中动态INCLUDE与静态INCLUDE的区别? 70 310、JSP的常用指令 70 311、什么情况下调用doGet()和doPost()? 70 312、JSP和Servlet 有哪些相同点和不同点,他们之间的联系是什么? 70 313、Request对象的主要方法: 70 314、JSP有哪些动作?作用分别是什么? 71 315、JSP的两种跳转方式分别是什么?有什么区别? 71 316、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 71 317、EJB与JAVA BEAN的区别? 72 318、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的? 72 319、EJB规范规定EJB中禁止的****作有哪些? 72 320、remote接口和home接口主要作用 72 321、bean 实例的生命周期 72 322、EJB的激活机制 73 323、EJB的几种类型 73 324、客服端调用EJB对象的几个基本步骤 73 325、EJB需直接实现它的业务接口或Home接口吗,请简述理由。 73 327、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别 73 328、你在项目中用到了xml技术的哪些方面?如何实现的? 73 329、JAVA SERVLET API中forward() 与redirect()的区别? 73 330、面向对象的特征? 73 331、Java中的异常处理机制? 74 333、Java中的事件处理机制? 74 334、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 75 335、GC是什么?为什么要有GC (基础) ? 75 336、请说出你所知道的线程同步的方法。 75 337、什么是Java序列化,如何实现Java 序列化? 75 338、介绍Java中的Collection Framework(包括如何写自己的数据结构)? 75 339、String是最基本的数据类型吗? 76 340、谈谈final, finally, finalize 的区别? 76 341、Static Nested Class 和Inner Class的不同? 76 342、HashMap和Hashtable的区别? 76 343、ArrayList和Vector的区别? 76 344、Collection 和Collections的区别? 77 345、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 77 346、String与StringBuffer的区别? 77 347、静态变量和实例变量的区别? 77 348、List、Map、Set三个接口,存取元素时,各有什么特点? 77 349、说出ArrayList,Vector, LinkedList的存储性能和特性。 77 350、在Java中一个类被声明为final类型,表示了什么意思? 77 351、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 77 352、String s = new String("xyz");创建了几个String Object? 77 353、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 77 354、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 78 355、数组有没有length()这个方法? String 有没有length()这个方法? 78 356、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 78 357、List, Set, Map是否继承自Collection接口? 78 358、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 78 360、构造器Constructor是否可被override? 78 361、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 78 362、try {}里有一个return 语句,那么紧跟在这个try后的finally {}里的code 会不会被执行,什么时候被执行,在return前还是后? 78 363、描述一下JVM加载class文件的原理机制? 78 364、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 78 365、Java中会存在内存泄漏吗,请简单描述。 78 366、是否可以从一个static方法内部发出对非static方法的调用? 79 367、写clone()方法时,通常都有一行代码,是什么? 79 368、在Java中,如何跳出当前的多重嵌套循环? 79 370、给我一个你最常见到的runtime exception。 79 371、写一个Singleton出来 79 372、Java 的通信编程编程题(或问答),用JAVA SOCKET编程,读服务器几个符,再写入本地显示? 80 373、用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 如在 COLLECTION框架中,实现比较要实现什么样的接口? 81 374、编写一个截取符串的函数,输入为一个符串和节数,输出为按节截取的符串。 82 380、ArrayList和Vector的区别, HashMap和Hashtable的区别 83 381、== 与 equals 的区别: 83 382、写一个 SQL Server 中的存储过程: 83 383、写一个 Oracle 中的存储过程: 84 384、HTTP 的请求过程: 84 385、多线程的优点 84 387、java是否存在内存泄露 85 388、Corba概述 85 389、toString方法的概述 85 390、Object类的概述 85 391、什么叫抽象类?抽象类跟接口有什么区别?为什么引进数据接口概念? 85 392、doGet与doPut的区别? 85 393、多线程实现有那几种方法,同步有哪几种方法? 85 394、JSP页面的跳转? 86 395、类变量的初始化 86 396、数组的定义 86 397、说明List和Set的区别 86
相关内容见《java程序设计实验指导》 清华大学出版社出版 第1章 Java语言概述和开发环境 1.1 预备知识 1.2 实验1 JDK 5.0路径设置 1.3 实验2 在DOS环境下编译和运行Application和Applet程序 1.4 实验3 在JBuilder 2005中配置JDK 5.0编译环境 1.5 实验4 在JBuilder 2005中开发Application和Applet程序 第2章 基本数据类型和基本运算 2.1 预备知识 2.2 实验 基本运算练习 第3章 控制语句 3.1 预备知识 3.2 实验1 评判学生成绩等级 3.3 实验2 输出九九乘法表 第4章 数组 4.1 预备知识 4.2 实验1 数组排序 4.3 实验2 鸽巢原理的模拟 4.4 实验3 矩阵相乘问题 4.5 实验4 "速算24"游戏 第5章 类和对象 5.1 预备知识 5.2 实验1 对象的创建和使用 5.3 实验2 类的静态成员与实例成员 5.4 实验3 变量的作用域和this关键 5.5 实验4 方法重载 第6章 继承和多态 6.1 预备知识 6.2 实验1 子类的派生与方法覆盖 6.3 实验2 多态性与动态绑定 6.4 实验3 嵌套类和内部类 第7章 包、接口常用工具类 7.1 预备知识 7.2 实验1 包的使用与访问控制 7.3 实验2 接口的实现与运用 7.4 实验3 Java的常用工具类 第8章 符串 8.1 预备知识 8.2 实验1 一个String类的简单应用 8.3 实验2 单词替换和统计问题 8.4 实验3 符串的比较和查找最长子串 8.5 实验4 单词逆向输出问题 8.6 实验5 ISBN书号校验问题 第9章 Applet小应用程序 9.1 预备知识 9.2 实验1 Applet生命周期 9.3 实验2 Applet的参数提取 9.4 实验3 鼠标响应监测 第10章 Java的图形处理和Java 2D初步 10.1 预备知识 10.2 实验1 绘制国际象棋棋盘 10.3 实验2 绘制基本三角函数曲线 10.4 实验3 绘制金塔形状 第11章 Java的GUI编程初步 11.1 预备知识 11.2 实验1 按钮有序排列 11.3 实验2 密码验证问题 11.4 实验3 名片录入管理界面设计 11.5 实验4 文体设计窗体 11.6 实验5 骑士巡游游戏 第12章 异常处理 12.1 预备知识 12.2 实验1 除数为零异常 12.3 实验2 创建自己的日期错误异常类 12.4 实验3 异常处理的链式搜索 第13章 多线程编程 13.1 预备知识 13.2 实验1 使用Thread类创建4线程程序 13.3 实验2 一个实现Runnable接口的小应用程序 13.4 实验3 线程同步与资源共享 13.5 实验4 wait( )和notify( )挂起与恢复线程 第14章 文件和流 14.1 预备知识 14.2 实验1 文本浏览器 14.3 实验2 文本编辑器 14.4 实验3 成绩排队 14.5 实验4 用RandomAccessFile实现名片记录本 14.6 实验5 Zip的压缩和解压缩 第15章 网络编程 15.1 预备知识 15.2 实验1 操纵URL以访问网络资源 15.3 实验2 一个网络交互式汇率转换程序 15.4 实验3 基于TCP/IP的Socket通信 第16章 多媒体技术 16.1 预备知识 16.2 实验1 文滚动条 16.3 实验2 幻灯片的定制和显示 16.4 实验3 水中倒影 16.5 实验4 音乐日历 16.6 实验5 媒体播放器 第17章 数据库编程初步 17.1 预备知识 17.2 实验1 连接数据库 17.3 实验2 基本数据库操作 17.4 实验3 多国货币兑换

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值