Ответ 1
Приемник должен установить порт приемника для соответствия порту, установленному в отправителе DatagramPacket. Для отладки попробуйте прослушивать порт > 1024 (например, 8000 или 9000). Порты < 1024 обычно используются системными службами и требуют доступа администратора для привязки к такому порту.
Если приемник отправляет пакет на жестко закодированный порт, который он прослушивает (например, порт 57), а отправитель находится на одном компьютере, тогда вы создадите loopback для самого ресивера. Всегда используйте порт, указанный в пакете, и в случае программного обеспечения для производства потребуется проверка в любом случае, чтобы предотвратить такой случай.
Другая причина, по которой пакет не попадет в пункт назначения, - это неправильный IP-адрес, указанный в отправителе. UDP в отличие от TCP попытается отправить пакет, даже если адрес недоступен, и отправитель не получит индикацию ошибки. Вы можете проверить это, напечатав адрес в приемнике в качестве меры предосторожности для отладки.
В отправителе, который вы установили:
byte [] IP= { (byte)192, (byte)168, 1, 106 };
InetAddress address = InetAddress.getByAddress(IP);
но может быть проще использовать адрес в строковой форме:
InetAddress address = InetAddress.getByName("192.168.1.106");
Другими словами, вы устанавливаете цель как 192.168.1.106. Если это не приемник, вы не получите пакет.
Вот простой приемник UDP, который работает:
import java.io.IOException;
import java.net.*;
public class Receiver {
public static void main(String[] args) {
int port = args.length == 0 ? 57 : Integer.parseInt(args[0]);
new Receiver().run(port);
}
public void run(int port) {
try {
DatagramSocket serverSocket = new DatagramSocket(port);
byte[] receiveData = new byte[8];
System.out.printf("Listening on udp:%s:%d%n",
InetAddress.getLocalHost().getHostAddress(), port);
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
while(true)
{
serverSocket.receive(receivePacket);
String sentence = new String( receivePacket.getData(), 0,
receivePacket.getLength() );
System.out.println("RECEIVED: " + sentence);
// now send acknowledgement packet back to sender
InetAddress IPAddress = receivePacket.getAddress();
String sendString = "polo";
byte[] sendData = sendString.getBytes("UTF-8");
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,
IPAddress, receivePacket.getPort());
serverSocket.send(sendPacket);
}
} catch (IOException e) {
System.out.println(e);
}
// should close serverSocket in finally block
}
}