java.net 包详解
java.net
包是 Java 标准库中用于网络编程的核心包,提供了实现网络应用程序的类和接口。这个包包含了用于处理网络通信的各种类,从底层的套接字到高层的 URL 处理。
1. 核心类和接口
1.1 URL 相关类
URL (Uniform Resource Locator)
表示统一资源定位符,指向互联网上的资源
常用构造方法:
URL(String spec) // 通过字符串创建URL URL(String protocol, String host, String file)
常用方法:
String getProtocol() // 获取协议 String getHost() // 获取主机 int getPort() // 获取端口 String getFile() // 获取文件名 InputStream openStream() // 打开到此URL的连接并返回输入流
URLConnection
表示与URL指向资源的通信连接
常用方法:
void connect() // 打开通信连接 InputStream getInputStream() // 获取输入流 OutputStream getOutputStream() // 获取输出流
HttpURLConnection (extends URLConnection)
专门用于HTTP协议的URL连接
常用方法:
int getResponseCode() // 获取HTTP响应码 String getResponseMessage() // 获取HTTP响应消息 void setRequestMethod(String method) // 设置请求方法(GET/POST等)
1.2 InetAddress 类
表示IP地址(IPv4和IPv6)
常用方法:
static InetAddress getByName(String host) // 通过主机名获取IP static InetAddress getLocalHost() // 获取本地主机地址 String getHostAddress() // 获取IP地址字符串 String getHostName() // 获取主机名
1.3 Socket 相关类
Socket
客户端套接字,用于建立到服务器的连接
常用构造方法:
Socket(String host, int port)
常用方法:
InputStream getInputStream() OutputStream getOutputStream() void close()
ServerSocket
服务器端套接字,等待客户端连接
常用构造方法:
ServerSocket(int port)
常用方法:
Socket accept() // 监听并接受连接 void close()
1.4 DatagramSocket 相关类
DatagramSocket
用于发送和接收数据报包(UDP协议)
常用方法:
void send(DatagramPacket p) void receive(DatagramPacket p)
DatagramPacket
表示数据报包
常用构造方法:
// 接收数据包 DatagramPacket(byte[] buf, int length)// 发送数据包 DatagramPacket(byte[] buf, int length, InetAddress address, int port)
2. 网络编程示例
2.1 URL 示例
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 示例
服务器端:
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();
}
客户端:
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 示例
发送方:
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();
}
接收方:
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 代理设置
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 管理
CookieManager manager = new CookieManager();
CookieHandler.setDefault(manager);
3.3 网络接口
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等)
超时设置:设置合理的连接和读取超时
socket.setSoTimeout(3000); // 3秒超时
网络安全:考虑使用SSL/TLS进行加密通信(通过HttpsURLConnection)
5. Java 11+ 新特性
Java 11引入了新的HTTP客户端API(java.net.http
包),提供了更现代的HTTP客户端实现:
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处理到底层的套接字通信,可以满足各种网络应用开发需求。