Java在Ubuntu上的网络编程指南
1. 准备工作:安装JDK
在Ubuntu上进行Java网络编程前,需先安装Java开发工具包(JDK)。推荐使用OpenJDK 11及以上版本(稳定且开源),通过以下命令完成安装:
sudo apt update
sudo apt install openjdk-11-jdk -y
安装完成后,通过java -version和javac -version命令验证安装是否成功(应显示JDK版本信息)。
2. 核心基础:TCP套接字编程
TCP(传输控制协议)是Java网络编程中最常用的可靠协议,适用于需要数据完整性的场景(如文件传输、聊天应用)。其核心类为ServerSocket(服务器端)和Socket(客户端)。
2.1 TCP服务器端实现
服务器端通过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());
}
}
}
2.2 TCP客户端实现
客户端通过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());
}
}
}
2.3 编译与运行
- 将上述代码保存为
TCPServer.java和TCPClient.java,存放在同一目录下。 - 编译代码:
javac TCPServer.java TCPClient.java - 运行服务器:在终端1中执行
java TCPServer,服务器将开始监听端口。 - 运行客户端:在终端2中执行
java TCPClient,客户端将连接到服务器并允许输入消息。输入bye可退出客户端。
3. UDP网络编程(可选)
若需要更高效的无连接通信(如实时视频流、在线游戏),可使用UDP协议。其核心类为DatagramSocket(用于发送/接收数据包)和DatagramPacket(封装数据包)。
以下是一个简单的UDP服务器和客户端示例:
- 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(); } } - UDP客户端:
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()步骤。
4. 常见问题排查
- 端口被占用:若启动服务器时报错“Address already in use”,说明端口已被其他程序占用。可通过
sudo lsof -i :端口号查看占用进程,或更换端口(如12346)。 - 连接失败:若客户端无法连接到服务器,需检查服务器是否启动、IP地址是否正确(
localhost表示本机,远程服务器需替换为真实IP),以及防火墙是否阻止了端口(可通过sudo ufw allow 端口号开放端口)。
通过以上步骤,你可在Ubuntu上使用Java实现基本的网络编程。根据需求,可进一步扩展为多线程服务器(处理多个客户端)、HTTP服务器(处理网页请求)或加密通信(SSL/TLS)等高级功能。
以上就是关于“Java在Ubuntu上的网络编程指南”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm