2012-10-18 2 views
2

멀티 캐스트에서 문자열 수신에 문제가 있습니다. Java에서 UDP 멀티 캐스트를 사용하는 것은 처음입니다.UDP 멀티 캐스트에서 문자열을받을 수 없습니다.

LAN을 통해 다중 클라이언트 응용 프로그램을 만들고 있습니다. 그래서 로컬 IP 주소를 사용하고 있습니다. 데이터, 요청 등을 보낼 수 있도록 서버의 IP 주소를 찾기 위해 클라이언트가 필요합니다.

서버가 자신의 IP가있는 멀티 캐스트를 5 초마다 문자열로 보냈습니다. 클라이언트가이를 수신 할 수 있어야합니다. 문제는 아무것도받지 못한다는 것입니다. 2 개의 장치로 테스트 중이므로 localhost를 사용할 필요가 없습니다.

여기 내 코드의 일부는 다음과 같습니다 서버 측 :

MulticastIpSender 내가 메인 클래스에서이 방법을 넣어 {

private String serverIp; 
private int port; 
private String multicastAddress; 
private long WAITING_TIME = 5000; // 5 seconden 

private DatagramSocket socket; 

public MulticastIpSender(String serverIp, int port, String multicastAddress) throws SocketException { 
    super(); 
    this.serverIp = serverIp; 
    this.port = port; 
    this.multicastAddress = multicastAddress; 
    socket = new DatagramSocket(port); 
} 

public void run() { 
    while(true){ 
     try { 
      byte[] buf = new byte[256]; 
      buf = serverIp.getBytes(); 
      InetAddress group = InetAddress.getByName(multicastAddress); 
      DatagramPacket packet = new DatagramPacket(buf, buf.length, group, port); 
      socket.send(packet); 
      System.out.println("sent IP("+serverIp+") to group("+group+") on port "+port); 
      sleep(WAITING_TIME); 

     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

}

스레드 확장

공용 클래스 :

private void sendIpAddressToListeners() { 
    try { 
     multicastIpSender = new MulticastIpSender(serverIp,PORT,"230.0.0.1"); 
     multicastIpSender.run(); 
    } catch (SocketException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

}

나는이 같은 serverip로 얻을 :이 장치

String hostName = InetAddress.getLocalHost().getHostName(); 
     InetAddress addrs[] = InetAddress.getAllByName(hostName); 
if (!addr.isLoopbackAddress() && addr.isSiteLocalAddress()) { 
     myIp = addr.getHostAddress(); 
     } 
     } 
     System.out.println ("\nIP = " + myIp); 
     return myIp; 

그것이 나에게주는

클라이언트 측 192.168.1.2 :

multicastSocket = new MulticastSocket(PORT); 
     InetAddress address = InetAddress.getByName(MULTICAST_ADDRESS); 
     multicastSocket.joinGroup(address); 

     DatagramPacket serverIpPacket; 
     byte[] buf = new byte[256]; 
     serverIpPacket = new DatagramPacket(buf, buf.length); 
     while(receivedIp ==null){ 
      multicastSocket.receive(serverIpPacket); 
      receivedIp = new String(serverIpPacket.getData(), 0, serverIpPacket.getLength()); 
      System.out.println("received server ip: " + receivedIp); 
     } 

을! PORT = 4445 (서버 및 클라이언트 모두)

누군가가이 문제를 해결할 수 있거나 더 나은 방법을 설명 할 수 있기를 바랍니다.

+1

패킷에 ip를 명시 적으로 보낼 필요는 없습니다. 클라이언트는 패킷이 보낸 패킷을 확인하고 그에 응답 할 수 있어야합니다. – Wug

+1

제공된 모든 네트워킹 조언은 정확합니다. 또한 multicastIpSender.start()를 사용하는 것이 좋습니다. 실제 멀티 스레딩을하고 있다면. run()을 호출하면 호출하는 스레드에서 run() 메서드를 수행하는 반면 start() 메서드는 스레드를 처리 할 새 스레드를 생성합니다. 귀하의 경우에는 중요하지 않을 수 있습니다. – mfrankli

+0

글쎄, 난 여전히 해결책을 찾지 못했지만 방화벽 때문에 차단 될 수 있습니까? 그건 내 로컬 네트워크에만있어 ... – dumazy

답변

3

브로드 캐스트 주소에 정상적인 DatagramPacket의 보내기, 패킷이 로컬 네트워크의 모든 호스트를 수신합니다 브로드 캐스트 주소를 확인하는

사용 계산기,이 좋은 작품 (같은 네트워크 구성, 중요한 부분은 마스크이다) : http://www.subnet-calculator.com/

관련 문제