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连接建立的三次握手过程。

答案:

  1. 第一次握手:客户端发送SYN包到服务器,请求建立连接
  2. 第二次握手:服务器收到SYN包后,发送SYN+ACK包给客户端,确认连接请求
  3. 第三次握手:客户端收到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();
    }
}

问题分析:

  1. 没有异常处理机制
  2. 只能处理一个客户端连接
  3. 没有使用try-with-resources管理资源
  4. 缺少实际的数据处理逻辑

改进建议:

  • 使用try-with-resources确保资源正确关闭
  • 添加循环处理多个客户端
  • 添加异常处理
  • 考虑使用多线程处理并发连接