java - 如何在端口扫描器 java 实现中检测服务器状态

标签 java sockets network-scan

我正在用 Java 编写一个端口扫描器,我希望能够区分以下 4 个用例:

  • 端口已开放
  • 端口已打开,并且已读取服务器横幅
  • 端口已关闭
  • 服务器未上线

我有以下代码:

    InetAddress address = InetAddress.getByName("google.com");
    int[] ports = new int[]{21, 22, 23, 80, 443};
    for (int i = 0; i < ports.length; i++) {
        int port = ports[i];
        Socket socket = null;
        try {
            socket = new Socket(address, port);
            socket.setSoTimeout(500);
            System.out.println("port " + port + " open");
            BufferedReader reader = new BufferedReader(
                 new InputStreamReader(socket.getInputStream()));
            String line = reader.readLine();
            if (line != null) {
                System.out.println(line);
            }
            socket.close();
        } catch (SocketTimeoutException ex) {
            // port was open but nothing was read from input stream
            ex.printStackTrace();
        } catch (ConnectException ex) {
            // port is closed
            ex.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (socket != null && !socket.isClosed()) {
                try {
                    socket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

问题是,当端口关闭且无法访问服务器时,我都会收到 ConnectionException,但会显示不同的异常消息:

java.net.ConnectException:连接超时:连接

当连接从未建立时

java.net.ConnectException:连接被拒绝:连接

端口关闭时

因此,如果不深入研究实际的异常消息,我就无法区分这两个用例。

当我尝试使用不同的方法创建套接字时,也会发生同样的情况。如果我使用:

socket = new Socket();
socket.setSoTimeout(500);
socket.connect(new InetSocketAddress(address, port), 1000);

我有同样的问题,但有 SocketTimeoutException 。我得到一个

java.net.SocketTimeoutException:读取超时

如果端口已打开,但没有可读取的横幅,并且

java.net.SocketTimeoutException:连接超时

如果服务器不活跃端口已关闭。

有什么想法吗?提前致谢!

最佳答案

我认为除了解析异常消息之外你没有任何选择。您有什么理由不这样做吗?

关于java - 如何在端口扫描器 java 实现中检测服务器状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2776729/

相关文章:

java - Jena model.读取时间和内存问题

java - 如何检查 Java 派生类型是否是当前调用堆栈的一部分?

objective-c - 列出/扫描可用的 WiFi iPhone

c - 套接字 - 发现防火墙端口

java- 从 ID 获取时区

JavaFX 按钮不可点击

sockets - .gethostbyaddr()不适用于所有设备。为什么? (Python)

c - accept() 调用时出现 Linux C Socket :"bad file descriptor"

c# - C# 中的套接字通信 - IP 端口

Android 在设备扫描后列出 BLE 设备