Java 网络操作示例


Java 中网络管理与 IO 流一样拥有着错综复杂的分支,虽平日涉及的网络开发更多的是使用 okhttp 等工具库,但对于部分基础场景,Java 自带功能即可满足,下面就让我们了解一番。

1. 资源服务

(1) URI

URIJava 中用于标识统一资源的位置和标识符, 如文件、网页、电子邮件。

(2) URL

除了 URI 同时还提供了 URL 专门针对网络资源,可以理解为 URI 的子集。

URL 的基本使用示例如下,通过其可以验证 URL 资源的合法性以及其基本信息:

java
public void urlDemo() {
    String http = "http://127.0.0.1:8080/api/user/list";
    try {
        URL url = new URL(http);
        // Get url protocol
        String protocol = url.getProtocol();
        System.out.println("Protocol: " + protocol);

        // Get url host
        String host = url.getHost();
        System.out.println("Host: " + host);

        // Get url port
        int port = url.getPort();
        System.out.println("Port: " + port);
        
        // Get url address
        String path = url.getPath();
        System.out.println("Path: " + path);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
(3) IP查询

通过 InetAddress 类可以获取当前本机服务的 IP 等信息。

方法 作用
getLocalHost() 获取本机服务信息实例。
getHostName() 获取本机 hostname。
getHostAddress() 获取服务 IP 信息。

相应的代码示例如下:

java
public void demo throws Exception {
    InetAddress localHost = InetAddress.getLocalHost();

    // Host: node102/192.168.0.103
    String host = String.valueOf(localHost);
    System.out.println("Host: " + host);

    // Host name: node103
    String hostName = localHost.getHostName();
    System.out.println("Host name: " + hostName);
    
    // IP: 192.168.0.103
    String ipAddress = localHost.getHostAddress();
    System.out.println("IP: " + ipAddress);
}

3. 服务测试

(1) PING

通过 isReachable() 方法测试当前服务能否访问目标 IP ,作用效果类似于 PING 命令。

java
private boolean pingHost(String ip) {
    boolean isConnected;
    try {
        InetAddress inet = InetAddress.getByName(ip);
        isConnected = inet.isReachable(10000);
    } catch (Exception e) {
        isConnected = false;
    }
    return isConnected;
}
(2) Telnet

通过 connect() 方法测试当前服务能否访问目标 IP 与端口,作用效果类似于 Telnet 命令。

java
private boolean telnetHost(String ip, int port) {
    boolean isConnected;
    try (Socket socket = new Socket()) {
        InetSocketAddress inet = new InetSocketAddress(ip, port);
        socket.connect(inet, 10000);
        isConnected = socket.isConnected();
    } catch (Exception e) {
        isConnected = false;
    }
    return isConnected;
}

3. 网络请求

HttpURLConnectionJDK 自带的网络请求工具类,常见方法参考下表。

注意针对创建的连接复用取决于是否开启了长连接,以及是否关闭了 getInputStream() 返回的流对象,详细说明可以参考官方文档:链接直达.

方法 作用
openConnection() 新建网络连接服务。
setRequestMethod() 设置请求方式,默认 GET。
setConnectTimeout() 设置连接超时时间。
setReadTimeout() 设置读取超时时间。
getInputStream() 读取连接返回流数据。
disconnect() 关闭连接。

如测试 http://127.0.0.1:8080/demo 页面服务是否正常。

java
private boolean testUrl(String urlAddr) {
    boolean isConnected;
    try {
        URL url = new URL(urlAddr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(10000);
        conn.setReadTimeout(10000);
        isConnected = 200 == conn.getResponseCode();
        conn.disconnect();
    } catch (Exception e) {
        isConnected = false;
    }
    return isConnected;
}

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !