Java MulticastSocket, вызывающий исключение нулевого указателя

#java #nullpointerexception #multicastsocket

#java #исключение nullpointerexception #multicastsocket

Вопрос:

Я пытаюсь заставить многоадресный сокет работать в «серверном» приложении, которое будет передавать информацию на кучу телефонов Android. Фрагмент кода, ответственный за настройку сокета и отправку некоторых данных, выглядит следующим образом:

     private MulticastSocket multisocket;
    private DatagramPacket packet;
    private InetAddress addr;
    private Question question;

    byte[] buffer = "Some text to be sent".getBytes();
    packet = new DatagramPacket(buffer, buffer.length);

    try {
        addr = InetAddress.getByName("228.5.6.7");
        multisocket = new MulticastSocket(4446);
        multisocket.joinGroup(addr);

    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        System.out.println("Sending...");
        multisocket.send(packet); // This is the line it dies on...     
        System.out.println("Text sent, closing socket");
        multisocket.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
  

Что происходит, так это то, что оно попадает в multisocket.send(packet); строку и исчезает со следующей информацией о трассировке стека:

 Exception in thread "SendThread" java.lang.NullPointerException: null address || null buffer
    at java.net.PlainDatagramSocketImpl.send(Native Method)
    at java.net.DatagramSocket.send(Unknown Source)
    at Model.QuestionSendThread.run(CommServer.java:158)
  

… и я в недоумении, почему.

У меня есть один вопрос (и он оправдывает его бессмысленность) — является ли IP-адрес, который вы задаете в многоадресном сокете, просто заполнителем, или вам действительно нужно, чтобы ваш IP-адрес был установлен на это? Половина меня думает, что вы, вероятно, этого не делаете — другая половина кричит об обратном — но я не могу найти ничего, что подтверждало бы это при поиске ответа в Google — только то, что это должен быть адрес в довольно узком диапазоне. Если я ошибся (мой IP 192.168.1.3), то в этом проблема? Или это что-то другое.

Заранее спасибо

Стив

Ответ №1:

MulticastSocket и это joinGroup() связано с приемом многоадресных пакетов. Отправка многоадресных пакетов аналогична отправке обычных UDP-пакетов на адрес группы, поэтому вам необходимо установить адрес назначения и порт для каждого пакета:

 packet = new DatagramPacket(buffer, buffer.length, group, 4446); 
...
multisocket.send(packet);
  

Смотрите также:

Комментарии:

1. Это сработало, большое спасибо 🙂 Я весь день смотрел на разные сокеты … терялся во всем этом…

Ответ №2:

Что он сказал. На самом деле вам вообще не нужен MulticastSocket или joinGroup() для отправки: вы можете сделать это с помощью обычного DatagramSocket. Но вы должны поместить адрес назначения в пакет DatagramPacket. Кроме того, ваша обработка исключений находится на пределе. Если вы получаете исключение в первом блоке try, вы все равно переходите ко второму. Весь этот код должен находиться внутри одного блока try.

Комментарии:

1. Спасибо… Я изучаю это на лету — перенесу все это в одну попытку / catch… (Eclipse до сих пор делал это за меня)

Ответ №3:

Вы также можете получить такое же исключение java.lang.NullPointerException: null buffer || null address из вызовов send, если InetSocketAddress запись в DatagramPacket.setAddress(...) была неразрешена или неправильно сформирована.

Например, это выглядит правдоподобно, учитывая обычный InetAddress.toString() формат, но это не так:

 DatagramPacket.setAddress(new InetSocketAddress("/239.193.129.14", 3450))