Java 网络编程详解
Java 网络编程(Network Programming)主要用于处理 TCP/IP、UDP、Socket 通信,支持 客户端-服务器(C/S)模型 以及 HTTP 请求。
1. Java 网络编程基础
1.1 Java 网络编程核心 API
Java 提供了一系列网络相关的 API,主要包括:
| 类 | 作用 |
|---|---|
InetAddress | 处理 IP 地址(IPv4 / IPv6) |
Socket | 实现 TCP 客户端 |
ServerSocket | 实现 TCP 服务器端 |
DatagramSocket | 实现 UDP 通信 |
DatagramPacket | 处理 UDP 数据包 |
URL / URLConnection | 处理 HTTP / FTP |
2. Java InetAddress(IP 地址类)
InetAddress 代表 IP 地址,用于处理主机名和 IP 之间的转换。
2.1 获取本机和远程 IP
import java.net.*;
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
// 获取本机 IP
InetAddress localHost = InetAddress.getLocalHost();
System.out.println("本机 IP: " + localHost.getHostAddress());
// 获取远程主机 IP
InetAddress remoteHost = InetAddress.getByName("www.google.com");
System.out.println("Google IP: " + remoteHost.getHostAddress());
}
}
3. Java TCP 通信
TCP(传输控制协议)是面向连接的可靠通信协议。
3.1 TCP 服务器端
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999); // 监听 9999 端口
System.out.println("服务器启动,等待连接...");
Socket socket = serverSocket.accept(); // 等待客户端连接
System.out.println("客户端已连接:" + socket.getInetAddress());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = in.readLine();
System.out.println("收到消息:" + message);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hello, Client!");
in.close();
out.close();
socket.close();
serverSocket.close();
}
}
3.2 TCP 客户端
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 9999); // 连接服务器
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hello, Server!");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("服务器回复:" + in.readLine());
in.close();
out.close();
socket.close();
}
}
4. Java UDP 通信
UDP(用户数据报协议)是无连接的通信协议,适用于高速传输但不保证可靠性。
4.1 UDP 服务器端
import java.net.*;
public class UDPServer {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8888);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
System.out.println("UDP 服务器已启动,等待数据...");
socket.receive(packet); // 接收数据
String message = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到消息:" + message);
socket.close();
}
}
4.2 UDP 客户端
import java.net.*;
public class UDPClient {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
InetAddress address = InetAddress.getByName("localhost");
String message = "Hello, UDP Server!";
byte[] buffer = message.getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 8888);
socket.send(packet); // 发送数据
System.out.println("数据已发送!");
socket.close();
}
}
5. Java 处理 HTTP 请求
Java 提供 URL 和 URLConnection 处理 HTTP 访问。
5.1 发送 HTTP GET 请求
import java.io.*;
import java.net.*;
public class HttpGetExample {
public static void main(String[] args) throws Exception {
URL url = new URL("https://www.google.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET"); // 发送 GET 请求
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
connection.disconnect();
}
}
6. Java 多线程 Socket 服务器
6.1 多线程处理多个客户端
import java.io.*;
import java.net.*;
class ClientHandler extends Thread {
private Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String message = in.readLine();
System.out.println("收到客户端消息:" + message);
out.println("服务器收到:" + message);
in.close();
out.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class MultiThreadedServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("多线程服务器启动,等待客户端连接...");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接:" + clientSocket.getInetAddress());
new ClientHandler(clientSocket).start();
}
}
}
7. Java NIO(非阻塞 IO)
Java NIO(New IO)提供了高性能的网络通信能力,适用于高并发场景(如聊天室、Web 服务器)。
7.1 NIO 服务器
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
public class NioServer {
public static void main(String[] args) throws IOException {
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(9999));
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("NIO 服务器启动...");
while (true) {
selector.select();
for (SelectionKey key : selector.selectedKeys()) {
if (key.isAcceptable()) {
SocketChannel clientChannel = serverChannel.accept();
clientChannel.configureBlocking(false);
clientChannel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
SocketChannel clientChannel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = clientChannel.read(buffer);
if (bytesRead > 0) {
System.out.println("收到:" + new String(buffer.array()).trim());
}
}
}
}
}
}
总结
✅ Socket 适用于 TCP 连接
✅ DatagramSocket 适用于 UDP
✅ URLConnection 适用于 HTTP 访问
✅ NIO 适用于高并发网络通信
更多详细内容请关注其他相关文章。