【问题标题】:How do I detect server status in a port scanner java implementation如何在端口扫描程序 java 实现中检测服务器状态
【发布时间】:2010-05-05 20:58:35
【问题描述】:

我正在用 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 sockets network-scan


    【解决方案1】:

    我认为您除了解析异常消息之外别无选择。您是否有理由不这样做?

    【讨论】:

    • 我认为依靠字符串消息来决定正在发生的事情有点“肮脏”,所以我不想这样做。我只是想知道是否还有其他我不知道的选择。
    【解决方案2】:

    ConnectException 只有一个空构造函数和一个errorMesssage 构造函数。 API 中没有 ConnectException 的子类。所以恐怕,Java没有正确访问的原因。解析异常消息似乎是唯一的方法,尽管它的翻译非常混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-24
      • 2020-06-07
      • 1970-01-01
      • 2022-01-19
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多