java.net 包详解

java.net 包是 Java 标准库中用于网络编程的核心包,提供了实现网络应用程序的类和接口。这个包包含了用于处理网络通信的各种类,从底层的套接字到高层的 URL 处理。


1. 核心类和接口

1.1 URL 相关类

URL (Uniform Resource Locator)

  • 表示统一资源定位符,指向互联网上的资源

  • 常用构造方法:

    java 复制代码
    URL(String spec)  // 通过字符串创建URL
    URL(String protocol, String host, String file)
  • 常用方法:

    java 复制代码
    String getProtocol()  // 获取协议
    String getHost()      // 获取主机
    int getPort()         // 获取端口
    String getFile()      // 获取文件名
    InputStream openStream()  // 打开到此URL的连接并返回输入流

URLConnection

  • 表示与URL指向资源的通信连接

  • 常用方法:

    java 复制代码
    void connect()               // 打开通信连接
    InputStream getInputStream() // 获取输入流
    OutputStream getOutputStream() // 获取输出流

HttpURLConnection (extends URLConnection)

  • 专门用于HTTP协议的URL连接

  • 常用方法:

    java 复制代码
    int getResponseCode()        // 获取HTTP响应码
    String getResponseMessage()  // 获取HTTP响应消息
    void setRequestMethod(String method) // 设置请求方法(GET/POST等)

1.2 InetAddress 类

  • 表示IP地址(IPv4和IPv6)

  • 常用方法:

    java 复制代码
    static InetAddress getByName(String host)  // 通过主机名获取IP
    static InetAddress getLocalHost()         // 获取本地主机地址
    String getHostAddress()                   // 获取IP地址字符串
    String getHostName()                      // 获取主机名

1.3 Socket 相关类

Socket

  • 客户端套接字,用于建立到服务器的连接

  • 常用构造方法:

    java 复制代码
    Socket(String host, int port)
  • 常用方法:

    java 复制代码
    InputStream getInputStream()
    OutputStream getOutputStream()
    void close()

ServerSocket

  • 服务器端套接字,等待客户端连接

  • 常用构造方法:

    java 复制代码
    ServerSocket(int port)
  • 常用方法:

    java 复制代码
    Socket accept()  // 监听并接受连接
    void close()

1.4 DatagramSocket 相关类

DatagramSocket

  • 用于发送和接收数据报包(UDP协议)

  • 常用方法:

    java 复制代码
    void 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);
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. 安全注意事项

  1. 异常处理:网络操作可能抛出多种异常(UnknownHostException, ConnectException等),需要妥善处理

  2. 资源释放:确保关闭所有网络资源(Socket, InputStream等)

  3. 超时设置:设置合理的连接和读取超时

    java 复制代码
    socket.setSoTimeout(3000); // 3秒超时
  4. 网络安全:考虑使用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处理到底层的套接字通信,可以满足各种网络应用开发需求。

相关推荐
一叶飘零_sweeeet3 小时前
深入 Spring 内核:解密 15 种设计模式的实战应用与底层实现
java·spring·设计模式
凤山老林3 小时前
排序算法:详解插入排序
java·开发语言·后端·算法·排序算法
彦楠4 小时前
IDEA实用快捷键
java·ide·intellij-idea
豆沙沙包?4 小时前
2025年--Lc197-077. 排序链表(链表,尾插法)--Java版
java·数据结构·链表
m0_651593914 小时前
深入理解软件设计中的协议与规范:从理论到Java实践
java·软件工程·代码规范·设计规范
Knight_AL4 小时前
Tomcat 类加载器隔离机制的实际应用
java·tomcat
FreeBuf_4 小时前
Spring两大漏洞可导致泄露敏感信息及安全防护绕过(CVE-2025-41253/41254)
java·安全·spring
江太翁4 小时前
Kotlin 与 Java 互操作中常用注解
java·python·kotlin
notillusion4 小时前
URR#69598
java·php·程序优化