2013-08-17 3 views
2

포트가 열려 있는지 또는 서버가 실행 중인지 확인하고 싶습니다.
는 이미 "/ 시스템/빈/핑 (ping)"와 "InetAdress"와 같은 여러 가지 방법을 시도하지만, 메신저를 잘하면 나는이와 지정된 포트 핑 어차피 :/Android/Java에서 포트가 열려 있는지 확인하십시오.

내가 그것을 만든이 시간을 idea DatagramSockets so :

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) {} 

"Inet"이 표시되지만 "Send"메시지가 표시되지 않으므로 송신이되지 않습니다. 예외 메시지를 얻으려고 시도했지만 NetworkOnMainThreadException입니다.

+0

다음을 명심하십시오. 포트가 로컬 시스템이나 원격 시스템에서 열려 있는지 여부를 나타 냅니까? –

+0

바로, 서버 포트가 열려 있으면 안드로이드 폰에서 확인하고 싶습니다. – Caddaile

+0

질문과 관련이 없지만 (UI 액세스 위반시 작동하지만 유효한 응답으로 문제가 발생할 수 있음) 스레드에서 'textView1.setText (...)'를 사용할 수 없습니다. UI 개체는 항상 스레드를 만든 스레드 만 액세스 할 수 있습니다. 당신은'runOnUiThread'을 사용하고'Runnable'을 전달해야하고'run()'메서드는 UI 코드를 오버라이드해야합니다. – Tseng

답변

2

특정 포트에 대해 ping을 수행 할 수 없습니다. "ping"은 ICMP 에코 요청입니다. ICMP는 인터넷 계층 프로토콜이므로 "포트"개념이 없습니다.

Socket을 사용하여 포트에 TCP 연결을 설정할 수 있습니다. 연결되면 뭔가가 TCP 연결을 수신하고있었습니다. 연결되지 않으면 어떤 방식으로도 연결할 수 없습니다.

DatagramSocket을 사용하여 포트로 패킷을 보내려는 시도를 할 수 있습니다. 성공하면 무언가가 데이터를 수신하고있을 것입니다. 실패하면 무언가가 잘못되었습니다 (UDP 패킷이 UDP로 수신되지 않거나 무언가가 실제로 패킷을 거절하면 ICMP 오류 메시지가 다시 전송됩니다).

위의 두 가지 방법을 모두 사용하여 TCP와 UDP를 확인해야합니다.

InetAddress은 기본적으로 ICMP 요청을 ping으로 사용하지만이 작업을 수행 할 수있는 권한이 없으면 대신 TCP 연결을 설정하려고 시도합니다. 그러나 에 ICMP 패킷을 생성 할 수있는 권한이있는 경우 TCP 연결을 강제로 시도 할 수 없습니다. 따라서 해당 방법을 사용하려면 Socket을 사용하십시오.

0

netstat 명령의 출력을 구문 분석하여 원하는 포트에서 수신 대기중인 것이 있는지 확인할 수 있습니다.

따라서 ProcessBuilder, netstat 명령과 일부 parsing 논리를 사용하십시오. 이 도움이 http://home.heeere.com/tech-androidjmdns.html 희망 대신 열린 포트 또는 서버를 실행 찾으려고 노력의

+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

, 그냥이 링크를 확인, 서버 방송에게 서비스를하도록하고 클라이언트에서 응답을 청취.

관련 문제