編程自學指南:java程序設計開發,網絡編程基礎
學習目標:
-
理解網絡協議(TCP/IP、UDP)的核心概念
-
掌握Socket編程實現客戶端與服務端通信
-
能夠通過多線程處理并發網絡請求
-
開發簡單的網絡應用(如聊天程序、文件傳輸工具)
一、課程引入
1.1 網絡編程的應用場景
-
實時通信:聊天軟件、視頻會議
-
數據傳輸:文件下載、云存儲
-
遠程控制:物聯網設備管理、服務器監控
1.2 核心概念
-
IP地址:設備的唯一標識(如
192.168.1.1
) -
端口號:應用程序的通信入口(0~65535)
-
TCP vs UDP:
-
TCP:可靠傳輸(三次握手),如網頁瀏覽、文件傳輸
-
UDP:高效但不可靠,如視頻流、實時游戲
-
二、TCP編程
2.1 服務端開發步驟
-
創建
ServerSocket
監聽端口 -
調用
accept()
等待客戶端連接 -
通過輸入輸出流進行數據讀寫
-
關閉資源
案例1:服務端回聲程序(Echo Server)
public class TCPServer { public static void main(String[] args) throws IOException { try (ServerSocket serverSocket = new ServerSocket(8888)) { System.out.println("服務端啟動,等待連接..."); Socket clientSocket = serverSocket.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println("收到客戶端消息:" + inputLine); out.println("【服務端響應】" + inputLine); // 回聲 } } }
}
2.2 客戶端開發步驟
-
創建
Socket
連接服務端 -
通過輸入輸出流通信
案例2:TCP客戶端
public class TCPClient { public static void main(String[] args) throws IOException { try (Socket socket = new Socket("localhost", 8888)) { PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); String userInput; while ((userInput = stdIn.readLine()) != null) { out.println(userInput); System.out.println("服務端回復:" + in.readLine()); } } }
}
三、UDP編程
3.1 數據報通信(DatagramSocket)
案例3:UDP消息發送與接收
// 發送端
public class UDPSender { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(); byte[] data = "Hello UDP".getBytes(); DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 9999); socket.send(packet); socket.close(); }
} // 接收端
public class UDPReceiver { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(9999); byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet); String msg = new String(packet.getData(), 0, packet.getLength()); System.out.println("收到消息:" + msg); socket.close(); }
}
四、HTTP客戶端開發
4.1 使用HttpURLConnection
案例4:獲取網頁內容
public class HTTPClient { public static void main(String[] args) throws IOException { URL url = new URL("https://www.example.com"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { String line; while ((line = in.readLine()) != null) { System.out.println(line); } } }
}
五、綜合案例:多線程聊天室
5.1 服務端(支持多客戶端)
public class ChatServer { private static final List<Socket> clients = new ArrayList<>(); public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("聊天室服務端啟動..."); while (true) { Socket clientSocket = serverSocket.accept(); clients.add(clientSocket); new Thread(() -> handleClient(clientSocket)).start(); } } private static void handleClient(Socket clientSocket) { try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) { String msg; while ((msg = in.readLine()) != null) { System.out.println("廣播消息:" + msg); broadcast(msg, clientSocket); } } catch (IOException e) { e.printStackTrace(); } } private static void broadcast(String msg, Socket sender) { for (Socket client : clients) { if (client != sender) { try { PrintWriter out = new PrintWriter(client.getOutputStream(), true); out.println(msg); } catch (IOException e) { e.printStackTrace(); } } } }
}
5.2 客戶端代碼(參考案例2修改)
-
每個客戶端獨立線程接收服務端廣播消息
六、常見錯誤與最佳實踐
6.1 常見錯誤
-
錯誤1:端口被占用
new ServerSocket(8888); // 若端口已被占用,拋出BindException
錯誤2:未處理Socket超時
socket.setSoTimeout(5000); // 設置讀取超時時間,避免無限等待
6.2 最佳實踐
-
使用try-with-resources自動關閉Socket和流
-
TCP場景選擇:
-
需可靠傳輸 → TCP(如文件傳輸)
-
需低延遲 → UDP(如實時游戲)
-
-
多線程優化:使用線程池(如
ExecutorService
)管理客戶端連接
七、總結與練習
7.1 總結
-
TCP編程:可靠傳輸,需建立連接(三次握手)
-
UDP編程:高效但不可靠,適合實時場景
-
HTTP客戶端:通過URLConnection訪問Web服務
7.2 課后任務
-
實現一個TCP文件傳輸工具(客戶端發送文件,服務端保存)
-
用UDP協議實現簡單的時間服務器(客戶端請求時間,服務端返回當前時間)
-
預習下一節課:反射與注解
7.3 擴展挑戰
-
基于WebSocket實現實時聊天程序(可借助Java EE或Spring框架)