【发布时间】:2014-10-11 17:18:54
【问题描述】:
我一直在尝试创建一个应用程序,该应用程序需要尽快扫描网络(主要是 LAN)上的开放端口。
我四处搜索,发现一个很棒的方法使用以下代码:
(1 to 65536).par.map { case port ⇒
try {
val socket = new java.net.Socket("127.0.0.1", port)
socket.close()
println(port)
port
} catch {
case _: Throwable ⇒ -1
}
}.toSet
但是,代码的问题是,如果我输入 127.0.0.1 或 localhost 以外的任何位置(例如 192.168.1.2),应用程序就会冻结。
知道为什么会发生这种情况以及如何解决吗?
附:我还尝试使用 socket.setSoTimeout(1500) 设置套接字超时,但没有任何变化。
【问题讨论】:
-
当您建立连接时,您会阻止等待,直到远程主机响应或连接尝试超时。在您的情况下,尝试连接到不存在的主机意味着您将花费所有时间等待超时。与 any 程序一样,如果您不忽略异常,您就会意识到这一点。
-
@kdgregory 我尝试设置 socket.setSoTimeout(3000) 但也没有用。
-
3 秒乘以 65536 仍然是很多时间。
-
您和支持您的人需要阅读一些文档。 “并行”并不意味着“无限线程”。
-
人们通过提问来学习。没有错。