有没有办法像在 Zenmap 中那样用 Java 检测端口 "version"?

Is there a way I can detect a port "version" with Java like in Zenmap?

我正在制作一个带有 Java 套接字的小项目,它就像一个端口扫描器,我想知道我是否可以像 Zenmap 一样检测端口 "version"。如果您不熟悉我在说什么,如果您使用 zenmap 扫描目标然后转到 "Ports / Hosts",您会得到类似 this.

的内容

我想知道是否可以在 Java 中获取端口 "version" 信息。

连接成功后,尝试读取服务器发送的第一行。许多应用程序在建立连接时标识自己。对于像您的示例这样的 ftp 服务器尤其如此。

例如,这连接到服务器上的一个端口并从服务器发送的内容中读取最多 1000 个字节,这应该足够了:

Socket s = new Socket(hostname, port)
InputStream in = s.getInputStream();
byte[] bs = new byte[1000];
int len = in.read(bs);
s.close();

然后您可以将这些字节转换为字符串:

String serverInfo = new String(bs, 0, len);
// I got "SSH-2.0-OpenSSH_5.3\r\n" in a test

并非所有协议都以服务器发送内容开始,因此您还应该设置从套接字读取的超时。