检查正在使用的端口
Posted
技术标签:
【中文标题】检查正在使用的端口【英文标题】:Check what ports are being used 【发布时间】:2011-06-24 13:20:17 【问题描述】:如何查看某个 IP 地址的服务在哪些端口运行。 (请用java代码)
编辑:我的教授问“每次程序发现正在运行的服务时,它都必须打印消息”。从那以后,我想他想让我找出正在使用的端口。然而,我只是再次问他。他告诉我,我只需要检测一个空闲(未使用)的端口。
所以,我想我解决了我的问题。 感谢您的帮助。
【问题讨论】:
你的意思是像nmap
这样的东西吗? (nmap.org)。
【参考方案1】:
InetAddress addr = InetAddress.getByName("hostName");
Socket socket = new Socket(addr, 8090);
热门/试用的想法是尝试不同的端口。如果上面的代码 sn-p 没有抛出异常,那么主机正在接受该端口上的连接。如果不是,您将看到异常,通常是 ConnectException。 我并不是说这是一种理想的方式,但这只是一种选择。
【讨论】:
是的,我知道如何找到空闲端口。但我想要的是找到一个有正在运行的服务的端口。【参考方案2】:public int getServiceByName(String tcpipService, String tcpipClass)
int port = -1;
try
String line;
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(
"/etc/services")));
while (((line = br.readLine()) != null)
&& (port == -1))
if ((line.length() != 0)
&& (line.charAt(0) != '#'))
port = parseServicesLine(line,
tcpipService, tcpipClass);
br.close();
return (port);
catch (IOException ioe)
return -1;
private int parseServicesLine(String line,
String tcpipService)
StringTokenizer st = new
StringTokenizer(line, " \t/#");
if (! st.hasMoreTokens())
return -1; // error
String name = st.nextToken().trim();
if (! st.hasMoreTokens())
return -1; // error
String portValue = st.nextToken().trim();
// Return port number, if name on this line matches:
if (name.equals(tcpipService))
try
return (Integer.parseInt(portValue));
catch (NumberFormatException nfe)
return -1;
else
return -1;
上面的代码 sn -p 根据服务名搜索 /etc/inet/services 文件并返回端口号。
【讨论】:
【参考方案3】:尝试在命令提示符下使用 netstat 命令。您可以键入 netstat -h 来查看帮助,但 netstat -b 似乎会显示正在运行的进程。
【讨论】:
【参考方案4】:如果您的意思是在计算机上运行 Java 程序以检查该计算机的端口可用性,请查看此内容。
Checking port availability in Java
如果您的意思是使用 Java 程序从远程计算机获取端口信息,祝您好运。您可以尝试连接到不同的端口并检查哪些端口拒绝连接.. 但这是一个糟糕的主意。
【讨论】:
如果连接被拒绝,说明端口正在被使用? 对不起,拒绝可能是错误的词。如果您尝试连接到不接受/侦听连接的 IP/端口,您将收到超时错误。具体来说,您可能会得到:java.net.ConnectException: Connection timed out: connect【参考方案5】:您要么必须在 java 中执行命令行参数(如 netstat),要么执行端口扫描。端口扫描还将检测您无法侦听的端口,即使它们未在使用中。例如,除非您是 root,否则您的系统可能不允许使用端口 443。
类似:
for(int port=0; port<65536; port++)
try
new ServerSocket(port);
System.out.println("Successfully listend on port " + port);
//clean up socket here
catch (IOException e)
System.out.println("Could not listen on port " + port);
【讨论】:
“Could not listen on port”表示该端口上有服务运行?因为我想要的是检测该端口上是否有服务。 这是为你自己的系统准备的。我相信他是在询问远程系统。这个基本代码仍然有效,除了您将使用客户端套接字并尝试连接到远程系统。 对不起。我忘了从其中一个词中去掉“不”这个词。 它无法识别我在 8080 上运行的 oracle以上是关于检查正在使用的端口的主要内容,如果未能解决你的问题,请参考以下文章