java.net
包是 Java 标准库中用于网络编程的核心包,提供了实现网络应用程序的类和接口。这个包包含了用于处理网络通信的各种类,从底层的套接字到高层的 URL 处理。
1. 核心类和接口
1.1 URL 相关类
URL (Uniform Resource Locator)
-
表示统一资源定位符,指向互联网上的资源
-
常用构造方法:
javaURL(String spec) // 通过字符串创建URL URL(String protocol, String host, String file)
-
常用方法:
javaString getProtocol() // 获取协议 String getHost() // 获取主机 int getPort() // 获取端口 String getFile() // 获取文件名 InputStream openStream() // 打开到此URL的连接并返回输入流
URLConnection
-
表示与URL指向资源的通信连接
-
常用方法:
javavoid connect() // 打开通信连接 InputStream getInputStream() // 获取输入流 OutputStream getOutputStream() // 获取输出流
HttpURLConnection (extends URLConnection)
-
专门用于HTTP协议的URL连接
-
常用方法:
javaint getResponseCode() // 获取HTTP响应码 String getResponseMessage() // 获取HTTP响应消息 void setRequestMethod(String method) // 设置请求方法(GET/POST等)
1.2 InetAddress 类
-
表示IP地址(IPv4和IPv6)
-
常用方法:
javastatic InetAddress getByName(String host) // 通过主机名获取IP static InetAddress getLocalHost() // 获取本地主机地址 String getHostAddress() // 获取IP地址字符串 String getHostName() // 获取主机名
1.3 Socket 相关类
Socket
-
客户端套接字,用于建立到服务器的连接
-
常用构造方法:
javaSocket(String host, int port)
-
常用方法:
javaInputStream getInputStream() OutputStream getOutputStream() void close()
ServerSocket
-
服务器端套接字,等待客户端连接
-
常用构造方法:
javaServerSocket(int port)
-
常用方法:
javaSocket accept() // 监听并接受连接 void close()
1.4 DatagramSocket 相关类
DatagramSocket
-
用于发送和接收数据报包(UDP协议)
-
常用方法:
javavoid send(DatagramPacket p) void receive(DatagramPacket p)
DatagramPacket
-
表示数据报包
-
常用构造方法:
java// 接收数据包 DatagramPacket(byte[] buf, int length) // 发送数据包 DatagramPacket(byte[] buf, int length, InetAddress address, int port)
2. 网络编程示例
2.1 URL 示例
java
try {
URL url = new URL("https://www.example.com");
URLConnection connection = url.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
in.close();
} catch (Exception e) {
e.printStackTrace();
}
2.2 TCP Socket 示例
服务器端:
java
try (ServerSocket serverSocket = new ServerSocket(8080)) {
System.out.println("服务器启动,等待连接...");
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("收到: " + inputLine);
out.println("服务器响应: " + inputLine);
}
} catch (IOException e) {
e.printStackTrace();
}
客户端:
java
try (Socket socket = new Socket("localhost", 8080)) {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("服务器回复: " + in.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
2.3 UDP 示例
发送方:
java
try (DatagramSocket socket = new DatagramSocket()) {
String message = "Hello UDP";
byte[] buf = message.getBytes();
InetAddress address = InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 9876);
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
接收方:
java
try (DatagramSocket socket = new DatagramSocket(9876)) {
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到: " + received);
} catch (IOException e) {
e.printStackTrace();
}
3. 高级特性
3.1 代理设置
java
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.example.com", 8080));
URL url = new URL("http://www.example.com");
URLConnection conn = url.openConnection(proxy);
3.2 Cookie 管理
java
CookieManager manager = new CookieManager();
CookieHandler.setDefault(manager);
3.3 网络接口
java
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface ni = interfaces.nextElement();
System.out.println("接口名: " + ni.getName());
System.out.println("显示名: " + ni.getDisplayName());
}
4. 安全注意事项
-
异常处理:网络操作可能抛出多种异常(UnknownHostException, ConnectException等),需要妥善处理
-
资源释放:确保关闭所有网络资源(Socket, InputStream等)
-
超时设置:设置合理的连接和读取超时
javasocket.setSoTimeout(3000); // 3秒超时
-
网络安全:考虑使用SSL/TLS进行加密通信(通过HttpsURLConnection)
5. Java 11+ 新特性
Java 11引入了新的HTTP客户端API(java.net.http
包),提供了更现代的HTTP客户端实现:
java
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.example.com"))
.build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
java.net
包为Java提供了全面的网络编程支持,从简单的URL处理到底层的套接字通信,可以满足各种网络应用开发需求。