내 첫 번째 게시물이므로 스타일이 잘 잡히지는 않았지만 시도해 보았습니다. 그래서 두 머신 모두 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();
'while (true)'는 ** 잘못된 코드 **이며 어느 시점에서 교착 상태가됩니다. 커널이 * (모든 것, 짝수) 중 일부를 건너 뛸 수 있습니다. * 루프 몸체 (Loop body). 그런 일이 발생하면 루프가 영원히 계속되어 스케줄러에 100 %로드가 걸립니다. 그런 응용 프로그램 상태는 대개 "매달리기"로 간주됩니다. "멋진 트릭"또는 이와 유사한 것을 사용하지 마십시오. 자동 기능이없는 코드는 좋지 않으며 프로그램 오류의 원인입니다. – specializt
@specializt 루프가 교착 상태를 일으키지 않습니다. 커널은 Java 코드를 실행하지 않으며, 수행 한 경우 루프의 일부를 건너 뛰지 않습니다. 'while (true)'는 '나쁘지 않은'것도 아니고 '멋진 트릭'도 아니며 '실제 기능'을 가지고 있습니다. – EJP
@specializt 별도의 스레드에서 "while (true)"을 사용하여 한 번만이 아니라 다른 모든 들어오는 패킷을 무시하고 프로그램이 살아있는 동안 서버가 항상 패킷에 응답하도록합니다. 편집 : 그것은 잘 응답하는 서버에 유니 캐스트를 보낼 때 말을 잊어 버렸습니다. –