2015-01-05 6 views
4

제목에서 알 수 있듯이, Java 프로젝트에서 약간의 문제가 있습니다. 내가하고 싶은 것은 이것이다 :피어 투 피어 (Peer to Peer) LAN상의 발견

  • 나는 응용 프로그램이 X
  • 는 또한 사이의 연결을 설정하기 위해 응용 프로그램 Y를

내가 뭘해야 할 것은 실행하는 다른 세 개의 컴퓨터를 실행하는 두 컴퓨터를 예를 들어, 누군가 X를 실행하는 컴퓨터를 사용하고 discovrey 프로세스가 끝나면 Y 앱을 실행하는 컴퓨터 목록과 IP 및 그 반대로 돌아갑니다.

나는 이것을 UDP 브로드 캐스팅을 사용하여 수행했지만 때로는 실패합니다. 컴퓨터는 기본적으로 라우터를 통해 WiFi를 통해 연결됩니다. 많은 경우에 X 컴퓨터는 UDP 검색 방법을 통해 Y 패킷을 볼 수 있지만 때때로 수동으로 IP를 지정하지 않는 경우도 있습니다. 심지어

private void start_Discovery() throws Exception { 
    //Keep a socket open to listen to all the UDP trafic that is destined for this port 
    socket = new DatagramSocket(2005, InetAddress.getByName("0.0.0.0")); 
    socket.setBroadcast(true); 

    while (true) { 
//  System.out.println(getClass().getName() + ">>>Ready to receive broadcast packets!"); 

     //Receive a packet 
     byte[] recvBuf = new byte[15000]; 
     DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length); 
     socket.receive(packet); 

     //Packet received 
//  System.out.println(getClass().getName() + ">>>Discovery packet received from: " + packet.getAddress().getHostAddress()); 
//  System.out.println(getClass().getName() + ">>>Packet received; data: " + new String(packet.getData())); 

     //See if the packet holds the right command (message) 
     String message = new String(packet.getData()).trim(); 
     if (message.equals("DISCOVER_ANDROID_SERVER_REQUEST")) { 
      byte[] sendData = "DISCOVER_ANDROID_SERVER_RESPONSE".getBytes(); 

      //Send a response 
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, packet.getAddress(), packet.getPort()); 
      socket.send(sendPacket); 

//   System.out.println(getClass().getName() + ">>>Sent packet to: " + sendPacket.getAddress().getHostAddress()); 
     } 
    } 
} 

때로는 서로를 볼 수없는 이유 : 내 "서버"

public static ArrayList<InetAddress> searchComputer() { 
    ArrayList<InetAddress> targets = new ArrayList<InetAddress>(); 
    try { 
     c = new DatagramSocket(); 
     c.setBroadcast(true); 

     byte[] sendData = "DISCOVER_PC_SERVER_REQUEST".getBytes(); 
     try { 
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("255.255.255.255"), 2005); 
      c.send(sendPacket); 
     } catch (Exception e) {} 
     Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); 

     while (interfaces.hasMoreElements()) { 
      NetworkInterface networkInterface = (NetworkInterface) interfaces.nextElement(); 

      if (networkInterface.isLoopback() || !networkInterface.isUp()) { 
       continue; 
      } 

      for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) { 
       InetAddress broadcast = interfaceAddress.getBroadcast(); 
       if (broadcast == null) { 
        continue; 
       } 

       try { 
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, broadcast, 8888); 
        c.send(sendPacket); 
       } catch (Exception e) { } 
      } 
     } 
     byte[] recvBuf = new byte[15000]; 
     DatagramPacket receivePacket = new DatagramPacket(recvBuf, recvBuf.length); 
     if (useInstant) { 
      c.setSoTimeout(500); 
     } 
     else { 
      c.setSoTimeout(4000); //EXECUTE THE WHILE FOR 4 SECONDS, THEN RETURN WHATEVER THE RESULTS ARE. 
     } 
     while (true) { 
      c.receive(receivePacket); 
      String message = new String(receivePacket.getData()).trim(); 
      if (message.equals("DISCOVER_PC_SERVER_RESPONSE")) { 
//    return receivePacket.getAddress(); 
       targets.add(receivePacket.getAddress()); 
      } 
     } 
//  c.close(); 
    } catch (IOException ex){} 
    return targets; 
} 

을 그리고 여기에 있습니다 : 여기

는 특정 포트에서 수신 대기 서버를 발견하기위한 코드입니다 그들이 동일한 라우터에 연결되어 있다면? EXTRA : 특별한 경우가 있습니까, X 컴퓨터가 LAN을 통해 연결되어 있고 Y 컴퓨터가 WiFi를 통해 연결되어 있습니까?

답변

1

동일한 라우터에 에 연결되어 있어도 때때로 서로를 볼 수없는 이유는 무엇입니까?

브로드 캐스팅은 비 연결형 프로토콜 인 UDP 서비스를 사용하기 때문에. UDP를 사용하면 데이터 패킷 (데이터 그램)을 네트워크의 일부 IP 주소로 보낼 수 있습니다. 데이터가 도착할 것이라는 보장이 없습니다.

X 컴퓨터는 LAN을 통해 연결되고 은 WiFi를 통해 연결되는 특별한 경우가 있습니까?

심지어 Xcmputers는 LAN을 통해 연결되고 Y는 WiFi를 통해 연결되며, 모두 동일한 라우터 네트워크에 속합니다. 따라서 네트워크 검색 및 네트워크 서비스를 사용할 수 있습니다. 어떤 문제도 없을 것입니다. 그것은 모두 공정하고 당신이 가진 경우와 다르지 않습니다!

+0

정보를 제공해 주셔서 감사합니다.하지만 패킷을 5-6 회 보내면 어떻게 될까요? 나는 약 5 번 패킷을 보내고 매번 답을 찾을 수 있도록 코드를 수정했다. 그러나이 방법이 신뢰할 수 없다면, 내가 사용할 수있는 것이 무엇이든 효율적입니까? 아니면 단순히 더 많은 성공률로? 그리고 하나의 질문입니다. IP를 255.255.255.255 및 0.0.0.0에서 브로드 캐스트 IP로 변경하면 어떻게됩니까? 마찬가지로 192.168.1.255 (미리 계산 됨) – KiralyCraft

+0

'멀티 캐스팅 '은 클래스 C 주소를 사용하여 이루어지며 UDP 서비스를 사용하여 수행됩니다. 매번 패킷을 폴링/전송하는 것 외에는 아무 것도 할 수 없습니다. 또한 조금 넓은 의미이기 때문에 질문에 대답 할 수 없습니다. 192.168.1.255를 사용하여 방송에 대한 도움말과 관련하여 새롭고/새로운 질문을하십시오! –

+0

고마워, 곧 클래스 C 브로드 캐스팅에 대한 새로운 질문을 던질 것입니다. D – KiralyCraft

관련 문제