#java #udp
#java #udp
Вопрос:
Это распространенная проблема, но, похоже, я не могу заставить это работать, это не из-за брандмауэра, я убедился, что Intellij был авторизован.
ОТПРАВИТЕЛЬ UDP:
public static void main(String[] args){
Timer timer = new Timer();
try {
InetAddress ip = InetAddress.getLocalHost();
int port = 9850;
byte[] buffer = new byte[100];
DatagramPacket packet = new DatagramPacket(buffer, 100, ip, port);
try {
DatagramSocket socket = new DatagramSocket(port, ip);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("will send !");
try {
socket.send(packet);
}catch (IOException e){
e.printStackTrace();
return;
}
System.out.println("was sent !");
}
},500, 500);
} catch (SocketException e) {
e.printStackTrace();
return;
}
}catch (UnknownHostException e){
e.printStackTrace();
return;
}
}
ПРИЕМНИК UDP
public static void main(String[] args) {
int port = 8888;
byte[] buffer = new byte[100];
DatagramPacket packet = new DatagramPacket(buffer, 100);
try {
DatagramSocket socket = new DatagramSocket(port);
while(true) {
try {
System.out.println("ready to receive");
socket.receive(packet);
System.out.println("received a packet");
}catch (IOException e){
e.printStackTrace();
return;
}
}
}catch(SocketException e){
e.printStackTrace();
return;
}
}
Пакеты отправлены, отправитель отображает «отправит / был отправлен», но получатель ничего не получает, он заблокирован и отображает только «готов к приему»
ps: неважно, что сокеты не закрыты…
Ответ №1:
Внимательно посмотрите на различные вызовы DatagramSocket
и DatagramPacket
, которые вы используете, поскольку вы злоупотребляете ими.
В программе-отправителе вы «создаете пакет дейтаграммы для отправки пакетов определенной длины length
на указанный номер порта на указанном хосте». Затем вы «создаете сокет дейтаграммы, привязанный к указанному локальному адресу». Поскольку вы используете тот же порт и InetAddr
, вы, по сути, отправляете пакет на тот же адрес, на который вы указываете в списке.
В программе-получателе вы «создаете[] сокет дейтаграммы и привязываете [] его к указанному порту на локальном хост-компьютере». На этот раз вы привязываете его к порту, отличному от того, на который вы его отправляете. (8888 против 9850, на который вы отправляете пакет).
Для отправителя пытаюсь создать сокет, привязанный к случайному порту, путем вызова DatagramSocket()
. Для получателя измените сокет таким образом, чтобы он был привязан к тому же порту с номером, на который отправитель пытается его отправить (например, 9850)
Комментарии:
1. Насколько я понимаю, порт, который я добавляю в сокет дейтаграммы, является исходным портом, а порт, который я добавляю в пакет дейтаграммы, является портом назначения. Хотя у меня может быть несколько указателей, адресаты которых имеют один и тот же порт с одного компьютера, только один может его прослушивать. Теперь я понимаю, почему ранее было выдано исключение!
Ответ №2:
вам не нужно использовать while(true), потому что метод DatagramPacket.прием будет блокироваться до тех пор, пока дейтаграмма не будет получена.
причиной проблемы может быть порт, который отличается от одной стороны к другой
Комментарии:
1. использование того же порта вызовет исключение, использование while (true) в данном случае является искусственным, это было просто для целей тестирования
2. вы отправляете пакет на порт localhost 9850, но никто не прослушивает порт
3. запустите получателя с порта 9850, а после этого запустите отправителя также с порта 9850, это должно сработать!
4. Хотя ваш ответ не был исчерпывающим, я поддержал ваш, чтобы уравновесить отрицательный ответ 😉 вы были правы, хотя dan.m был пользователем 2321368 , ответ был более полезным.
5. да, dan.m был пользователем 2321368 ответ более ясен, я согласен