Java 网络编程
网络编程允许计算机之间通过网络进行通信。Java 提供了强大的 java.net 包,使开发者能够轻松地创建网络应用程序,无论是基于 TCP 还是 UDP 协议。
网络基础
- IP 地址 (IP Address): 网络上每台计算机的唯一标识符。Java 使用
InetAddress类来表示 IP 地址。 - 端口 (Port): 一个 16 位的数字(0-65535),用于标识计算机上特定的应用程序或服务。一个 IP 地址和一个端口号组合起来,就能唯一确定网络上的一个进程。
- 套接字 (Socket): 是网络通信的端点。两个应用程序通过一对套接字(包含 IP 地址和端口)建立连接,进行数据交换。
InetAddress 类
InetAddress 类用于表示 IP 地址,它没有公共构造方法,只能通过静态方法创建实例。
java
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressExample {
public static void main(String[] args) {
try {
// 获取本地主机的地址
InetAddress localHost = InetAddress.getLocalHost();
System.out.println("本地主机名: " + localHost.getHostName());
System.out.println("本地 IP 地址: " + localHost.getHostAddress());
// 根据域名获取地址
InetAddress googleHost = InetAddress.getByName("www.google.com");
System.out.println("\nGoogle 主机名: " + googleHost.getHostName());
System.out.println("Google IP 地址: " + googleHost.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}TCP 编程
TCP (Transmission Control Protocol) 是一种面向连接、可靠的协议。通信双方需要先建立连接,然后才能进行数据传输,类似于打电话。
ServerSocket: 用于服务器端,监听指定的端口,等待客户端的连接请求。Socket: 用于客户端或服务器端,代表一个网络连接的两端之一。
TCP 服务器端示例
java
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws IOException {
// 1. 创建一个 ServerSocket,监听 8080 端口
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("服务器已启动,等待客户端连接...");
// 2. 调用 accept() 方法,阻塞等待客户端连接
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接: " + clientSocket.getInetAddress().getHostAddress());
// 3. 获取输出流,向客户端发送数据
OutputStream os = clientSocket.getOutputStream();
os.write("Hello, Client! You are connected.".getBytes());
os.flush();
// 4. 关闭资源
os.close();
clientSocket.close();
serverSocket.close();
}
}TCP 客户端示例
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) throws IOException {
// 1. 创建一个 Socket,连接到服务器的 IP 和端口
Socket socket = new Socket("127.0.0.1", 8080);
System.out.println("已连接到服务器。");
// 2. 获取输入流,读取服务器发送的数据
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String serverMessage = br.readLine();
System.out.println("收到服务器消息: " + serverMessage);
// 3. 关闭资源
br.close();
socket.close();
}
}UDP 编程
UDP (User Datagram Protocol) 是一种无连接、不可靠的协议。它不需要建立连接,直接将数据包(Datagram)发送到目标地址,速度快但可能丢包,类似于寄信。
DatagramSocket: 用于发送和接收数据报包。DatagramPacket: 用于封装要发送或接收的数据。
UDP 发送端示例
java
import java.io.IOException;
import java.net.*;
public class UdpSender {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
String message = "Hello, UDP Receiver!";
byte[] data = message.getBytes();
InetAddress receiverAddress = InetAddress.getByName("127.0.0.1");
int receiverPort = 9090;
// 创建数据包
DatagramPacket packet = new DatagramPacket(data, data.length, receiverAddress, receiverPort);
// 发送数据包
socket.send(packet);
System.out.println("消息已发送。");
socket.close();
}
}UDP 接收端示例
java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceiver {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9090);
byte[] buffer = new byte[1024];
// 创建接收数据包
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
// 接收数据(阻塞)
socket.receive(packet);
String receivedMessage = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到消息: " + receivedMessage);
socket.close();
}
}URL 编程
Java 还提供了高级 API 来处理 URL,方便地访问 Web 资源。
URL: 代表一个统一资源定位符。URLConnection: 可用于读取和写入 URL 指向的资源。
java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class UrlExample {
public static void main(String[] args) throws Exception {
URL url = new URL("https://www.example.com");
URLConnection connection = url.openConnection();
// 读取网页内容
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}
}