2011-02-10 4 views
1

Как проверить, в каких портах работает служба определенного IP-адреса. (код в java пожалуйста)Проверьте, какие порты используются

Редактировать: Мой проф спрашивает: «Каждый раз, когда программа обнаруживает запущенную службу, она должна печатать сообщение». Из этого я думал, что он хочет, чтобы я узнал, какие порты используются. Однако, я просто спросил его снова. И он сказал мне, что мне просто нужно обнаружить порт, который является бесплатным (не используется).

Итак, я думаю, что решаю свою проблему. Спасибо за помощь.

+0

Вы имеете в виду что-то вроде 'nmap'? (Http://nmap.org). – msandiford

ответ

0

Попробуйте использовать команду netstat в командной строке. Вы можете ввести netstat -h, чтобы увидеть справку, но, похоже, netstat -b покажет запущенные процессы.

0

Вам нужно либо выполнить аргумент командной строки (например, netstat) из сканирования java или порта. Сканирование портов также будет определять порты, которые вы не можете слушать, даже если они не используются. Например, ваша система может запретить порт 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

+1

Это для вашей собственной системы. Я считаю, что он спрашивает о удаленной системе. Этот базовый код все еще работает, за исключением того, что вы будете использовать клиентский сокет и пытаться подключиться к удаленной системе. – Jumbogram

+0

Извините. Я забыл взять слово «не» из одного из них. –

0

Если вы имеете в виду запуск программы Java на компьютере, чтобы проверить наличие порта этого компьютера, посмотрите на это.

Checking port availability in Java

Если вы имеете в виду с помощью программы Java, чтобы получить информацию о порте с удаленного компьютера, удачи. Вы можете попробовать подключиться к различным портам и проверить, какие из них отказывают в подключении. Но это ужасная идея.

+0

Если соединение отказано, это означает, что порт используется? – John

+0

Извините, отказался, вероятно, было неправильным словом. Вы получите ошибку таймаута, если попытаетесь подключиться к IP/порту, который не принимает/не прослушивает подключения. В частности, вы, скорее всего, получите следующее: java.net.ConnectException: время ожидания подключения: connect – Coeffect

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

Идея хита/пробной версии - попробовать различные порты. Если приведенный выше фрагмент кода не генерирует исключение, то хост принимает соединения на этом порту. Если это не так, вы увидите исключение, обычно ConnectException. Я не предлагаю, что это идеальный способ сделать это, но это просто вариант.

+0

Да, я знаю, как найти свободный порт. Но я хочу найти порт, в котором есть работающий сервис. – John

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 с именем службы и возвращает номер порта.

Смежные вопросы