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处理到底层的套接字通信,可以满足各种网络应用开发需求。

相关推荐
apocelipes18 小时前
POSIX兼容系统上read和write系统调用的行为总结
linux·c语言·c++·python·golang·linux编程
暴风鱼划水18 小时前
算法题(Python)数组篇 | 6.区间和
python·算法·数组·区间和
Derrick__118 小时前
Web Js逆向——加密参数定位方法(Hook)
python·js
2301_7965125218 小时前
Rust编程学习 - 如何利用代数类型系统做错误处理的另外一大好处是可组合性(composability)
java·学习·rust
南汐汐月18 小时前
重生归来,我要成功 Python 高手--day33 决策树
开发语言·python·决策树
清水18 小时前
Spring Boot企业级开发入门
java·spring boot·后端
lzjava202418 小时前
Spring AI使用知识库增强对话功能
人工智能·python·spring
一个不称职的程序猿19 小时前
高并发场景下的缓存利器
java·缓存
B站_计算机毕业设计之家19 小时前
深度血虚:Django水果检测识别系统 CNN卷积神经网络算法 python语言 计算机 大数据✅
python·深度学习·计算机视觉·信息可视化·分类·cnn·django
Q_Q51100828519 小时前
python+django/flask的校园活动中心场地预约系统
spring boot·python·django·flask·node.js·php