#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))