2016-06-01 4 views
0

내 첫 번째 게시물이므로 스타일이 잘 잡히지는 않았지만 시도해 보았습니다. 그래서 두 머신 모두 Java를 실행하고 있습니다. 나는 그들이 이런 식으로 달릴 것을 원합니다.자바 멀티 캐스트 소켓이 데이터를 보내지 못합니다.

클라이언트 : 수신 대기중인 서버로 멀티 캐스트를 보냅니다. 서버 : 서버가 멀티 캐스트를 캡처하고 서버가 실행되는 로컬 시스템의 이름과 함께 유니 캐스트를 보냅니다. 클라이언트 : 서버 주소로 유니 캐스트를 수신하고 호스트 이름으로 목록을 만듭니다.

클라이언트는 멀티 캐스트를 보내지 않습니다. (wireshark 캡쳐 패킷을 보았습니다) 멀티 캐스트 주소로 230.0.0.1을 넣었을 때만 메시지를 보내지 만 서버는 패킷을받지 못합니다.

EDIT : 서버에 유니 캐스트 패킷을 보내면 제대로 응답합니다. 다음 게시물에 대한 응답 ecle에 의해

MulticastSocket s = new MulticastSocket(5555); 
       s.joinGroup(InetAddress.getByName("225.1.1.1")); 
       while(true) 
       { 
        try 
        { 
         /* 
         * 225.1.100.1 
         * 
         DataSender.Impl.reply("225.1.100.1", 5555, InetAddress.getLocalHost().getHostName(), "get_ip");*/      
         byte[] buf = new byte[256]; 
         DatagramPacket p = new DatagramPacket(buf, buf.length); 
         s.receive(p); 
         System.out.println("DEBUG: received request"); 
        } 
        catch(IOException e) 
        { 
         e.printStackTrace(); 
         break; 
        } 
       } 
       s.close(); 
+0

'while (true)'는 ** 잘못된 코드 **이며 어느 시점에서 교착 상태가됩니다. 커널이 * (모든 것, 짝수) 중 일부를 건너 뛸 수 있습니다. * 루프 몸체 (Loop body). 그런 일이 발생하면 루프가 영원히 계속되어 스케줄러에 100 %로드가 걸립니다. 그런 응용 프로그램 상태는 대개 "매달리기"로 간주됩니다. "멋진 트릭"또는 이와 유사한 것을 사용하지 마십시오. 자동 기능이없는 코드는 좋지 않으며 프로그램 오류의 원인입니다. – specializt

+0

@specializt 루프가 교착 상태를 일으키지 않습니다. 커널은 Java 코드를 실행하지 않으며, 수행 한 경우 루프의 일부를 건너 뛰지 않습니다. 'while (true)'는 '나쁘지 않은'것도 아니고 '멋진 트릭'도 아니며 '실제 기능'을 가지고 있습니다. – EJP

+0

@specializt 별도의 스레드에서 "while (true)"을 사용하여 한 번만이 아니라 다른 모든 들어오는 패킷을 무시하고 프로그램이 살아있는 동안 서버가 항상 패킷에 응답하도록합니다. 편집 : 그것은 잘 응답하는 서버에 유니 캐스트를 보낼 때 말을 잊어 버렸습니다. –

답변

0

코멘트 나 비슷한 문제를 해결 도움 : 여기

try 
    { 
     //The client runs on LeJOS EV3 so I used their classes a bit 
     LCDOutputStream lcd = new LCDOutputStream(); 
     PrintStream p = new PrintStream(lcd); 
     while(true) 
     { 
      if(Button.waitForAnyPress() == Button.ID_ESCAPE) 
      { 
       break; 
      } 

      byte[] buf = this.writeString("get_ip"); 
      DatagramSocket sender = new DatagramSocket(); 

      DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("230.0.0.1"), 5555); 
      sender.send(packet); 
      sender.close(); 
      p.println("Sent Multicast"); 
     } 
     p.close(); 
     lcd.close(); 
    } 
    catch(Exception e) 
    { 
     console.printException(e); 
    } 

에 서버 코드입니다 : 여기

내 코드입니다 Java Multicast sample program is unable to deliver packets within LAN (across hosts) . 내 경우에는 setInterface(<server address>);을 추가했습니다. 예를 들면 다음과 같습니다.

+0

DatagramSocket 대신 클라이언트 코드에서도이 코드를 사용할 수 있어야한다는 점을 잊어 버렸습니다. 또는 링크 된 게시물에서 언급했듯이 올바른 인터페이스에 바인딩하기 위해 생성자'DatagramSocket (int port, InetAddress laddr) '을 사용해야 할 수도 있습니다. – wgw

+0

은 localhost와 주소를 모두 사용하는 경우 작동합니다 225.1.1.1 –