Java 网络编程基础考题
选择题
1. 以下哪个类是Java中用于创建TCP服务器的核心类?
A. Socket
B. ServerSocket
C. DatagramSocket
D. URLConnection
答案:B
2. UDP协议的特点是什么?
A. 面向连接,可靠传输
B. 无连接,不可靠传输
C. 面向连接,不可靠传输
D. 无连接,可靠传输
答案:B
3. 在Java中,以下哪个类用于UDP通信?
A. Socket
B. ServerSocket
C. DatagramSocket
D. HttpURLConnection
答案:C
4. TCP三次握手的正确顺序是?
A. SYN → ACK → SYN+ACK
B. SYN → SYN+ACK → ACK
C. ACK → SYN → SYN+ACK
D. SYN+ACK → SYN → ACK
答案:B
5. 以下哪个端口号范围是系统保留端口?
A. 0-1023
B. 1024-49151
C. 49152-65535
D. 8000-9000
答案:A
填空题
1. Java中创建TCP客户端连接使用 _______ 类,创建服务器端监听使用 _______ 类。
答案:Socket, ServerSocket
2. UDP数据传输使用 _______ 类封装数据,通过 _______ 类进行发送和接收。
答案:DatagramPacket, DatagramSocket
3. 网络编程中,_______ 用于标识网络中的主机,_______ 用于标识主机上的具体服务。
答案:IP地址, 端口号
4. TCP是 _______ 协议,提供 _______ 的数据传输服务。
答案:面向连接, 可靠
5. 在Java网络编程中,_______ 类可以用来解析URL并建立HTTP连接。
答案:URLConnection
简答题
1. 简述TCP和UDP的主要区别。
答案:
- 连接性:TCP是面向连接的,UDP是无连接的
- 可靠性:TCP提供可靠传输,UDP不保证数据到达
- 速度:UDP传输速度快,TCP相对较慢
- 数据完整性:TCP保证数据完整性和顺序,UDP不保证
- 应用场景:TCP适用于文件传输、网页浏览等,UDP适用于视频直播、游戏等
2. 解释什么是Socket,以及它在网络编程中的作用。
答案:
Socket是网络编程中的一个抽象概念,代表网络通信的端点。它的作用包括:
- 提供应用程序与网络协议栈的接口
- 封装了复杂的网络通信细节
- 支持不同的协议(TCP、UDP等)
- 实现进程间的网络通信
- 提供数据的发送和接收功能
3. 描述TCP连接建立的三次握手过程。
答案:
- 第一次握手:客户端发送SYN包到服务器,请求建立连接
- 第二次握手:服务器收到SYN包后,发送SYN+ACK包给客户端,确认连接请求
- 第三次握手:客户端收到SYN+ACK包后,发送ACK包给服务器,确认连接建立
连接建立后,双方可以开始数据传输。
编程题
1. 编写一个简单的TCP服务器,监听8080端口,接收客户端消息并回显。
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(8080)) {
System.out.println("服务器启动,监听端口8080");
while (true) {
Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(
clientSocket.getOutputStream(), true);
String message = in.readLine();
System.out.println("收到消息: " + message);
out.println("回显: " + message);
clientSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 编写对应的TCP客户端,连接上述服务器并发送消息。
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 8080)) {
PrintWriter out = new PrintWriter(
socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
out.println("Hello Server!");
String response = in.readLine();
System.out.println("服务器响应: " + response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 编写一个UDP服务器,接收客户端数据包并返回响应。
import java.net.*;
public class UDPServer {
public static void main(String[] args) {
try (DatagramSocket socket = new DatagramSocket(9999)) {
System.out.println("UDP服务器启动,监听端口9999");
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
socket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到: " + message);
String response = "收到: " + message;
byte[] responseData = response.getBytes();
DatagramPacket responsePacket = new DatagramPacket(
responseData, responseData.length,
packet.getAddress(), packet.getPort());
socket.send(responsePacket);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. 编写对应的UDP客户端。
import java.net.*;
public class UDPClient {
public static void main(String[] args) {
try (DatagramSocket socket = new DatagramSocket()) {
String message = "Hello UDP Server!";
byte[] data = message.getBytes();
DatagramPacket packet = new DatagramPacket(
data, data.length,
InetAddress.getByName("localhost"), 9999);
socket.send(packet);
byte[] buffer = new byte[1024];
DatagramPacket responsePacket = new DatagramPacket(buffer, buffer.length);
socket.receive(responsePacket);
String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
System.out.println("服务器响应: " + response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
分析题
1. 分析以下代码的问题并给出改进建议:
public class BadServer {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8080);
Socket client = server.accept();
// 处理客户端请求
client.close();
server.close();
}
}
问题分析:
- 没有异常处理机制
- 只能处理一个客户端连接
- 没有使用try-with-resources管理资源
- 缺少实际的数据处理逻辑
改进建议:
- 使用try-with-resources确保资源正确关闭
- 添加循环处理多个客户端
- 添加异常处理
- 考虑使用多线程处理并发连接
浙公网安备 33010602011771号