сокет дейтаграммы Java не получен (localhost)

#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 ответ более ясен, я согласен