在Ubuntu上進行Java網絡編程前,需先安裝Java開發工具包(JDK)。推薦使用OpenJDK 11及以上版本(穩定且開源),通過以下命令完成安裝:
sudo apt update
sudo apt install openjdk-11-jdk -y
安裝完成后,通過java -version
和javac -version
命令驗證安裝是否成功(應顯示JDK版本信息)。
TCP(傳輸控制協議)是Java網絡編程中最常用的可靠協議,適用于需要數據完整性的場景(如文件傳輸、聊天應用)。其核心類為ServerSocket
(服務器端)和Socket
(客戶端)。
服務器端通過ServerSocket
監聽指定端口,等待客戶端連接。每接收到一個客戶端連接,就創建一個Socket
對象處理通信。以下是一個簡單的回顯服務器示例:
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
final int PORT = 12345; // 監聽端口
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
System.out.println("服務器已啟動,等待客戶端連接...");
while (true) {
Socket clientSocket = serverSocket.accept(); // 阻塞等待客戶端連接
System.out.println("客戶端已連接:" + clientSocket.getInetAddress());
// 獲取輸入/輸出流(用于數據傳輸)
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String clientMessage;
while ((clientMessage = in.readLine()) != null) { // 讀取客戶端消息
System.out.println("收到客戶端消息:" + clientMessage);
out.println("服務器回復:" + clientMessage); // 發送回復
}
clientSocket.close(); // 關閉客戶端連接
}
} catch (IOException e) {
System.err.println("服務器異常:" + e.getMessage());
}
}
}
客戶端通過Socket
連接到服務器,獲取輸入/輸出流后即可發送和接收數據。以下是一個簡單的客戶端示例:
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
final String SERVER_ADDRESS = "localhost"; // 服務器地址(本地測試用)
final int PORT = 12345; // 服務器端口
try (Socket socket = new Socket(SERVER_ADDRESS, PORT)) {
System.out.println("已連接到服務器");
// 獲取輸入/輸出流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader consoleInput = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while (true) {
System.out.print("請輸入消息(輸入'bye'退出):");
userInput = consoleInput.readLine();
if ("bye".equalsIgnoreCase(userInput)) break;
out.println(userInput); // 發送消息到服務器
String serverResponse = in.readLine(); // 接收服務器回復
System.out.println("服務器回復:" + serverResponse);
}
} catch (UnknownHostException e) {
System.err.println("無法找到服務器:" + e.getMessage());
} catch (IOException e) {
System.err.println("客戶端異常:" + e.getMessage());
}
}
}
TCPServer.java
和TCPClient.java
,存放在同一目錄下。javac TCPServer.java TCPClient.java
java TCPServer
,服務器將開始監聽端口。java TCPClient
,客戶端將連接到服務器并允許輸入消息。輸入bye
可退出客戶端。若需要更高效的無連接通信(如實時視頻流、在線游戲),可使用UDP協議。其核心類為DatagramSocket
(用于發送/接收數據包)和DatagramPacket
(封裝數據包)。
以下是一個簡單的UDP服務器和客戶端示例:
import java.net.*;
public class UDPServer {
public static void main(String[] args) throws IOException {
final int PORT = 12345;
DatagramSocket socket = new DatagramSocket(PORT);
byte[] buffer = new byte[1024];
System.out.println("UDP服務器已啟動,等待數據...");
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet); // 阻塞等待數據包
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到客戶端消息:" + received);
// 發送回復
String response = "UDP服務器已收到消息";
DatagramPacket reply = new DatagramPacket(response.getBytes(), response.length(),
packet.getAddress(), packet.getPort());
socket.send(reply);
socket.close();
}
}
import java.net.*;
public class UDPClient {
public static void main(String[] args) throws IOException {
final String SERVER_ADDRESS = "localhost";
final int PORT = 12345;
DatagramSocket socket = new DatagramSocket();
String message = "Hello, UDP Server!";
byte[] buffer = message.getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length,
InetAddress.getByName(SERVER_ADDRESS), PORT);
socket.send(packet); // 發送數據包
// 接收回復
byte[] replyBuffer = new byte[1024];
DatagramPacket replyPacket = new DatagramPacket(replyBuffer, replyBuffer.length);
socket.receive(replyPacket);
String reply = new String(replyPacket.getData(), 0, replyPacket.getLength());
System.out.println("服務器回復:" + reply);
socket.close();
}
}
編譯運行方式與TCP類似,但需注意UDP是無連接的,無需accept()
步驟。
sudo lsof -i :端口號
查看占用進程,或更換端口(如12346)。localhost
表示本機,遠程服務器需替換為真實IP),以及防火墻是否阻止了端口(可通過sudo ufw allow 端口號
開放端口)。通過以上步驟,你可在Ubuntu上使用Java實現基本的網絡編程。根據需求,可進一步擴展為多線程服務器(處理多個客戶端)、HTTP服務器(處理網頁請求)或加密通信(SSL/TLS)等高級功能。