最近有个需求,做一个类似港口扫描器的东西。
简单点说就是用来检测某个IP下的常用端口是否是开放的。
刚开始想到的是用: PING
一般我们测试某个ip是否能通,最简单的办法是用ping,但是ping无法针对端口。
想了想又想到个 telnet
这个应该是可行的。
但是在Java项目中模拟CMD有点难受。
突然想到还有个法子:Sorket
它可以对某个ip下的端口直接发起请求,还可以设置超时时间。
伪代码如下:
//定义需要扫描的端口号
private static final List<Integer> ports = new ArrayList<>(
Arrays.asList(139, 3128, 1723, 3124, 3133, 3389, 138, 5000, 3127, 1080, 137, 135, 8080, 445, 443, 80, 22, 31337)
);
List<Integer> openPortList = ports.stream().parallel().map(port -> {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), 2000); // 连接超时设置为2秒
socket.close();
return port;
} catch (Exception e) {
log.info(ip + ":" + port + "无法连通");
}
return null;
}).filter(Objects::nonNull).collect(Collectors.toList());
这样就可以实现一个简易版的端口扫描器了。