Java 网络编程详解:从基础到实战,彻底掌握 TCP/UDP、Socket、HTTP 网络通信
作为一名 Java 开发工程师,你一定在实际开发中遇到过需要与远程服务器通信、实现客户端/服务端架构、处理 HTTP 请求、构建分布式系统等场景。这时,Java 网络编程(Java Networking) 就成为你必须掌握的核心技能之一。
Java 提供了丰富的网络编程 API,从底层的 Socket 到高层的 URL、URLConnection、HttpURLConnection,再到现代的 HttpClient(Java 11+)、Netty 等,帮助开发者轻松实现网络通信。
本文将带你全面掌握:
- 网络编程基础(IP、端口、协议、OSI 模型)
- TCP 与 UDP 的区别与使用场景
- Java 中的 Socket 编程(TCP/UDP)
- 基于 HTTP 的网络通信(GET/POST 请求)
- 使用
URL
、URLConnection
、HttpClient
实现网络请求 - 多线程网络通信与服务器设计
- 实战:构建 TCP 服务端/客户端、HTTP 请求处理、聊天程序、远程调用
- 常见误区与最佳实践
并通过丰富的代码示例和真实项目场景讲解,帮助你写出更高效、更安全、结构更清晰的 Java 网络通信代码。
🧱 一、什么是网络编程?
✅ 网络编程定义:
网络编程是指程序通过网络与其他设备或程序进行数据交换的过程。它是实现分布式系统、客户端/服务端架构、远程通信、微服务等的基础。
✅ 常见术语:
🔍 二、TCP 与 UDP 的区别
Socket
、ServerSocket
DatagramSocket
、DatagramPacket
🧠 三、Java 中的网络编程核心类
✅ 1. InetAddress
:获取 IP 地址信息
InetAddress address = InetAddress.getByName(\"www.baidu.com\");System.out.println(\"IP地址:\" + address.getHostAddress());
✅ 2. Socket
和 ServerSocket
:TCP 编程核心类
TCP 服务端示例:
ServerSocket serverSocket = new ServerSocket(8888);System.out.println(\"服务端启动,等待连接...\");Socket socket = serverSocket.accept();BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));System.out.println(\"收到客户端消息:\" + reader.readLine());socket.close();serverSocket.close();
TCP 客户端示例:
Socket socket = new Socket(\"127.0.0.1\", 8888);PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);writer.println(\"Hello Server\");socket.close();
✅ 3. DatagramSocket
和 DatagramPacket
:UDP 编程核心类
UDP 接收端示例:
DatagramSocket socket = new DatagramSocket(9999);byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);System.out.println(\"收到消息:\" + new String(packet.getData(), 0, packet.getLength()));socket.close();
UDP 发送端示例:
DatagramSocket socket = new DatagramSocket();String msg = \"Hello UDP Server\";InetAddress address = InetAddress.getByName(\"127.0.0.1\");DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.length(), address, 9999);socket.send(packet);socket.close();
✅ 4. URL
、URLConnection
:处理 HTTP 请求
URL url = new URL(\"https://www.baidu.com\");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod(\"GET\");BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = reader.readLine()) != null) { System.out.println(line);}reader.close();
✅ 5. HttpClient
(Java 11+):现代 HTTP 客户端
HttpClient client = HttpClient.newHttpClient();HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(\"https://www.baidu.com\")) .build();HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());
🧪 四、网络编程实战应用场景
场景1:构建 TCP 聊天程序(多线程)
// 服务端new Thread(() -> { try (ServerSocket serverSocket = new ServerSocket(8888)) { while (true) { Socket socket = serverSocket.accept(); new Thread(() -> { try (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { System.out.println(\"收到消息:\" + line); } } catch (IOException e) { e.printStackTrace(); } }).start(); } } catch (IOException e) { e.printStackTrace(); }}).start();// 客户端Socket socket = new Socket(\"127.0.0.1\", 8888);PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);writer.println(\"你好,服务器!\");
场景2:模拟 HTTP 请求发送数据(如登录)
HttpClient client = HttpClient.newHttpClient();HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(\"https://example.com/login\")) .header(\"Content-Type\", \"application/x-www-form-urlencoded\") .POST(HttpRequest.BodyPublishers.ofString(\"username=admin&password=123456\")) .build();HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(\"响应码:\" + response.statusCode());System.out.println(\"响应内容:\" + response.body());
场景3:实现远程调用(RPC)基础框架
// 客户端发送方法调用Socket socket = new Socket(\"127.0.0.1\", 8888);ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());out.writeObject(new RpcRequest(\"sayHello\", new Object[]{\"Java\"}));// 服务端接收请求并处理ObjectInputStream in = new ObjectInputStream(socket.getInputStream());RpcRequest request = (RpcRequest) in.readObject();Object result = invoke(request);ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());out.writeObject(result);
🧱 五、网络编程最佳实践
socket.setSoTimeout(3000)
BufferedReader
、BufferedWriter
IOException
、UnknownHostException
等java.nio.channels.SocketChannel
🚫 六、常见误区与注意事项
InputStreamReader
指定编码InetAddress.getLocalHost()
获取公网 IP📊 七、总结:Java 网络编程核心知识点一览表
📎 八、附录:Java 网络编程常用技巧速查表
InetAddress.getLocalHost().getHostAddress()
new URL(\"https://www.baidu.com\").openStream()
HttpClient
+ HttpRequest.BodyPublishers.ofString()
socket.setSoTimeout(5000)
new BufferedReader(new InputStreamReader(...))
HttpRequest.BodyPublishers.ofString(json)
ExecutorService
处理每个 socket 连接NettyServerBootstrap
Selector
+ SocketChannel
如果你希望系统回顾 Java 网络编程的核心知识与实战技巧,这篇文章将为你提供完整的知识体系和实用的编程技巧。
欢迎点赞、收藏、转发,也欢迎留言交流你在实际项目中遇到的网络编程相关问题。我们下期再见 👋
📌 关注我,获取更多Java核心技术深度解析!