У меня возникли проблемы с получением строки из многоадресной рассылки. Я впервые использую многоадресную рассылку UDP в Java.
Я делаю многоклиентское приложение по локальной сети. Поэтому я использую локальные IP-адреса. Мне нужно, чтобы клиенты находили IP-адрес сервера, чтобы они могли отправлять свои данные, запросы и т. д.
Я позволил серверу отправлять многоадресную рассылку со своим собственным IP-адресом в виде строки каждые 5 секунд. Клиенты должны иметь возможность его получить. Проблема в том, что они ничего не получают. Я тестирую 2 устройства, поэтому мне не нужно использовать локальный хост.
Вот часть моего кода: Серверная сторона:
открытый класс MulticastIpSender расширяет Thread{
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);
}
!! ПОРТ = 4445 как на сервере, так и на клиенте
Я надеюсь, что кто-то может помочь мне с этим или может объяснить лучший способ сделать это.