Это мой первый пост, поэтому он может быть не очень стильным, но я пробовал ... Итак ... У меня две машины, работающие на Java. Я хочу, чтобы они запускали что-то вроде этого.Java Multicast Socket не отправляет данные
Клиент: отправляет многоадресную рассылку на серверы прослушивания. Сервер (ы): сервер фиксирует многоадресную рассылку и отправляет одноадресную рассылку с именем локальной машины, на которой выполняется сервер. Клиент: получает одноадресную рассылку с адресами сервера и делает список с именами хостов.
Но клиент даже не отправляет многоадресную рассылку (я смотрел пакеты захвата wirehark) Он отправляет что-то, когда я ставил 230.0.0.1 в качестве многоадресного адреса, но тогда сервер не получает пакет.
EDIT: Когда я отправляю одноадресный пакет на сервер, он отвечает штрафом.
Вот мой код:
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);
}
Вот код сервера:
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)' is ** bad code ** и сделает его тупиковым в какой-то момент времени - ваше ядро может пропустить ** любую ** часть * (все, даже) * ваше тело цикла, и если это произойдет, ваш цикл продолжится навсегда, поставив 100% нагрузку на ваш планировщик - такое состояние приложения обычно считается «зависанием». Не пытайтесь использовать «классные трюки» или что-то в этом роде, код, который не имеет реальной функции автоматически, является плохим и источником ошибок программы. – specializt
@specializt Циклы не вызывают взаимоблокировок. Ядра не выполняют Java-код, и если бы они это сделали, они не пропускали бы части циклов. 'while (true)' не является ни «плохим», ни «классным трюком» и имеет «реальную функцию». – EJP
@specializt Я использую «while (true)» в отдельном потоке, чтобы сервер отвечал на пакеты все время, пока программа жива, не только один раз, а затем игнорирует все остальные входящие пакеты. EDIT: Я забыл сказать, когда я отправляю одноадресную рассылку на сервер, он хорошо реагирует. –