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確保資源正確關閉
  • 添加循環處理多個客戶端
  • 添加異常處理
  • 考慮使用多線程處理并發連接