Java(网络编程)
Java 网络编程详解
Java 网络编程是指使用 Java 语言开发能够在网络环境中进行通信的应用程序。它主要基于客户端 - 服务器模型,通过 套接字 (Socket)实现不同设备间的数据交换。下面从核心概念到实践案例进行全面介绍。
一、核心概念
1. TCP 与 UDP
-
TCP (Transmission Control Protocol):
- 面向连接,提供可靠的数据传输(如 HTTP、FTP)。
- 特点:三次握手建立连接,数据有序且无差错。
-
UDP (User Datagram Protocol):
- 无连接,提供不可靠但高效的数据传输(如视频流、DNS)。
- 特点:无需建立连接,可能丢包或乱序,但开销小。
2. 端口号
- 标识进程的逻辑地址(范围:0-65535)。
- 常见端口:HTTP (80)、HTTPS (443)、FTP (21)、SSH (22)。
3. 套接字 (Socket)
- 网络编程的基础接口,分为:
- TCP Socket:
java.net.Socket
(客户端)和java.net.ServerSocket
(服务器)。 - UDP Socket:
java.net.DatagramSocket
和java.net.DatagramPacket
。
- TCP Socket:
二、TCP 网络编程
1. TCP 客户端实现
import java.io.*;
import java.net.*;public class TCPClient {public static void main(String[] args) {try {// 1. 创建Socket并连接到服务器Socket socket = new Socket("localhost", 8888);System.out.println("客户端已连接到服务器");// 2. 获取输入输出流PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));// 3. 发送和接收消息String message;while ((message = userInput.readLine()) != null) {out.println(message); // 发送消息到服务器System.out.println("服务器回复: " + in.readLine()); // 接收服务器回复}// 4. 关闭连接socket.close();} catch (IOException e) {e.printStackTrace();}}
}
2. TCP 服务器实现
import java.io.*;
import java.net.*;public class TCPServer {public static void main(String[] args) {try {// 1. 创建ServerSocket并监听端口ServerSocket serverSocket = new ServerSocket(8888);System.out.println("服务器启动,等待客户端连接...");while (true) {// 2. 接受客户端连接Socket clientSocket = serverSocket.accept();System.out.println("客户端已连接: " + clientSocket.getInetAddress());// 3. 为每个客户端创建线程处理请求new Thread(() -> {try {// 获取输入输出流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); // 回复客户端}// 关闭连接clientSocket.close();} catch (IOException e) {e.printStackTrace();}}).start();}} catch (IOException e) {e.printStackTrace();}}
}
三、UDP 网络编程
1. UDP 客户端实现
import java.io.*;
import java.net.*;public class UDPClient {public static void main(String[] args) {try {// 1. 创建DatagramSocketDatagramSocket socket = new DatagramSocket();// 2. 准备数据String message = "Hello, UDP Server!";byte[] sendData = message.getBytes();// 3. 创建目标地址和端口InetAddress address = InetAddress.getByName("localhost");int port = 9999;// 4. 创建并发送数据包DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);socket.send(sendPacket);// 5. 接收服务器响应byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(receivePacket);String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("服务器响应: " + response);// 6. 关闭Socketsocket.close();} catch (IOException e) {e.printStackTrace();}}
}
2. UDP 服务器实现
import java.io.*;
import java.net.*;public class UDPServer {public static void main(String[] args) {try {// 1. 创建DatagramSocket并绑定端口DatagramSocket socket = new DatagramSocket(9999);System.out.println("UDP服务器启动,监听端口: 9999");while (true) {// 2. 接收客户端数据包byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(receivePacket);// 3. 处理数据String message = new String(receivePacket.getData(), 0, receivePacket.getLength());InetAddress clientAddress = receivePacket.getAddress();int clientPort = receivePacket.getPort();System.out.println("收到来自 " + clientAddress + ":" + clientPort + " 的消息: " + message);// 4. 发送响应String response = "UDP服务器已收到: " + message;byte[] sendData = response.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);socket.send(sendPacket);}} catch (IOException e) {e.printStackTrace();}}
}
五、常见应用场景
- 即时通讯:如聊天软件(TCP)。
- 文件传输:如 FTP(TCP)。
- 实时游戏:如多人在线游戏(UDP)。
- Web 服务:如 REST API 调用(HTTP)。
- 分布式系统:如微服务间通信(HTTP/2)。
六、注意事项
- 异常处理:网络操作需捕获
IOException
。 - 资源管理:使用
try-with-resources
确保 Socket 关闭。 - 多线程:TCP 服务器需为每个客户端创建独立线程。
- 缓冲区大小:UDP 数据包大小受限于 MTU(通常≤65507 字节)。
- 性能优化:使用 NIO(非阻塞 IO)处理高并发场景。
网络编程是 Java 企业级开发的核心技能,掌握 TCP/UDP 通信原理和 HTTP 协议对构建分布式系统至关重要。