2011-02-10 95 views
1

如何检查哪些端口上有某个IP地址正在运行的服务。 (请用java代码)检查哪些端口正在使用

编辑:我的教授问:“每次程序发现一个正在运行的服务,它都必须打印消息”。从那以后,我以为他想让我找出哪些端口正在使用。但是,我再次问他。他告诉我,我只需要检测一个免费的(未使用)端口。

所以,我想我解决了我的问题。 感谢您的帮助。

+0

你是不是指`nmap`之类的东西? (http://nmap.org)。 – msandiford 2011-02-10 01:12:50

回答

0

尝试在命令提示符下使用netstat命令。你可以输入netstat -h来查看帮助,但看起来netstat -b会显示正在运行的进程。

0

您将不得不从java或端口扫描中执行命令行参数(如netstat)。端口扫描还会检测到即使不在使用中也无法侦听的端口。例如,您的系统可能会禁止端口443,除非您是root用户。

喜欢的东西:

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); 
    } 
} 
+0

“无法在端口上侦听”是指在该端口上运行的服务?因为我想要的是检测该端口上是否有服务。 – John 2011-02-10 01:21:11

+1

这是用于您自己的系统。我相信他在问一个远程系统。这个基本的代码仍然有效,除非你使用客户端套接字并尝试连接到远程系统。 – Jumbogram 2011-02-10 01:23:59

+0

对不起。我忘了把其中一个字改成“不”。 – 2011-02-10 01:58:18

0

如果你的意思是一台计算机上运行的Java程序,检查计算机的端口可用性,看看这个。

Checking port availability in Java

如果你的意思是使用Java程序来获得从远程计算机端口的信息,好运气。你可以尝试连接到不同的端口,并检查哪些拒绝连接..但这是一个可怕的想法。

1
InetAddress addr = InetAddress.getByName("hostName"); 
Socket socket = new Socket(addr, 8090); 

命中/试验的想法是尝试不同的端口。如果上面的代码片段没有抛出异常,那么主机正在接受该端口上的连接。如果不是,你会看到一个异常,通常是ConnectException。 我并不是说这是一个理想的解决方法,但它只是一个选择。

1
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; 
    } 
} 

上面的代码片段根据服务名搜索/ etc/inet/services文件并返回端口号。