在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)等高级功能。