在我的应用程序中,在运行时,我希望能够识别是否正在使用某个特定端口(非常容易实现)
public static boolean portAvailable(int port) {
try (Socket ignored = new Socket("localhost", port)) {
return false;
} catch (IOException ignored) {
return true;
}
}
但我也想尽可能多地获取有关谁使用此端口的信息。像进程ID,名称等的东西。我该怎么做呢?
答案 0 :(得分:1)
Java不提供您要查找的信息。您将不得不使用特定于操作系统的API。
我不了解* nix系统,但在Windows上,您可以使用GetTcpTable2()
/ GetTcp6Table2()
或GetExtendedTcpTable()
枚举TCP套接字来获取TCP套接字的拥有进程ID直到找到您感兴趣的IP /端口。对于UDP,有一个GetExtendedUdpTable()
功能(还有GetUdpTable()
和GetUdp6Table()
功能,但它们不提供所有者进程ID )。
获得进程ID后,您可以通过以下任一方式获取其文件名:
使用CreateToolhelp32Snapshot()
/ Process32First()
/ Process32Next()
枚举正在运行的进程,直到找到匹配的进程ID。
使用OpenProcess()
直接打开给定进程ID的进程,然后使用GetModuleFileNameEx()
,GetProcessImageFileName()
或QueryFullProcessImageName()
查询该进程的文件名。< / p>