2013-08-17 3 views
2

Я хотел бы проверить, открыт ли порт, или сервер работает на нем.
я уже пробовал несколькими способами, например, с «/ системы/бен/пинг» и «InetAdress», но если им права я не могу пинговать указанный порт с этим:/Проверьте, открыт ли порт на Android/Java

На этот раз я сделал это с идея DatagramSockets как так:

try { String messageStr="Hello!"; 
    int server_port = 25565; 
    DatagramSocket s = new DatagramSocket(); 
    InetAddress local = InetAddress.getByName("11.11.11.11"); 
    int msg_length=messageStr.length(); 
    byte[] message = messageStr.getBytes(); 
    DatagramPacket p = new DatagramPacket(message, msg_length,local,server_port); 
    textView1.setText("Inet"); 
    s.send(p); 
    textView1.setText("Send"); 
} catch (Exception e) {} 

я получаю «инет», но не сообщение «Отправить», поэтому я застреваю при отправке. Я попытался получить сообщение об исключении, и это NetworkOnMainThreadException.

+0

Просьба пояснить: Вы имеете в виду, если порт открыт на локальном компьютере или на удаленной машине? –

+0

Точно, я хочу проверить с телефона Android, если порт сервера открыт. – Caddaile

+0

Хотя это действительно не актуально для вопроса (это может вызвать проблемы с действительными ответами, которые работают, но сбой при нарушении доступа к пользовательскому интерфейсу), вы не можете использовать 'textView1.setText (...)' из потока. Объекты пользовательского интерфейса могут быть доступны только тем потоком, который их создал, который всегда является основным потоком. Вам нужно будет использовать 'runOnUiThread' и передать ему« Runnable », а в его' run() 'переопределить метод выполнить ваш код пользовательского интерфейса – Tseng

ответ

2

Вы не можете пинговать определенный порт. «Пинг» - это запрос эхо-сигнала ICMP. ICMP - это протокол интернет-уровня и, как таковой, не имеет понятия «порт».

Вы можете использовать Socket, чтобы попытаться установить TCP-соединение с портом. Если он подключается, то что-то прослушивает TCP-соединения. Если он не соединяется, то он каким-то образом недостижим.

Вы можете использовать DatagramSocket, чтобы попытаться отправить пакет в порт. Если это удастся, то что-то, вероятно, получает данные. Если это не удается, то что-то определенно пошло не так (кстати, сообщение об ошибке ICMP отправляется обратно, если принят пакет UDP, который адресован порту, который не открыт для UDP, или если что-то активно отказывается от пакета на этом пути).

Чтобы проверить как TCP, так и UDP, вам необходимо использовать оба вышеуказанных элемента.

Заметим, что InetAddress использует ICMP-запрос как ping по умолчанию, но если у него нет разрешения на это, он откажется от попытки установить TCP-соединение. Однако в случае, если у него есть, есть разрешение на создание пакетов ICMP, нет способа заставить его попробовать TCP-соединение. Поэтому, если вы хотите использовать этот метод, просто используйте Socket.

0

Вы можете попытаться проанализировать вывод команды netstat, чтобы проверить, есть ли что-то прослушивание на нужном порту.

Таким образом, используйте команду ProcessBuilder, netstat и некоторая parsing логика.

+0

OP хочет проверить удаленный порт. –

0
public ServerSocket create_server_socket(InetAddress[] ips, int[] ports) throws IOException { 

    for(InetAddress ip: ips) { 
     for (int port : ports) { 
      try { 
       return new ServerSocket(port,0,ip); 
      } catch (IOException ex) { 
       continue; // try next port 
      } 
     } 
     //try next ip 
    } 

    // if the program gets here, no ip:port in the range was found 
    throw new IOException("no free ip:port found"); 
} 
+0

OP хочет проверить удаленный порт. –

+0

Извините, я неправильно понял вопрос – oldmonk

0

Вместо того, чтобы пытаться найти открытый порт или сервер работает, просто дайте сервер вещания службы и слушать ответы от клиентов, проверить эту ссылку: http://home.heeere.com/tech-androidjmdns.html Надеюсь, что это помогает.

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