Java MulticastSocket вызывает исключение нулевого указателя - PullRequest
0 голосов
/ 18 апреля 2011

Я пытаюсь заставить многоадресный сокет работать на «серверном» приложении, которое будет плевать информацией на кучу телефонов 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)

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

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

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

Стив

Ответы [ 3 ]

4 голосов
/ 18 апреля 2011

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

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

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

1 голос
/ 18 апреля 2011

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

0 голосов
/ 26 июля 2016

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

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

DatagramPacket.setAddress(new InetSocketAddress("/239.193.129.14", 3450))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...