我正在尝试让一个多播套接字在一个“服务器”应用程序上工作,它将向一堆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)...and我不知道为什么。
我确实有一个问题(请原谅它的n00bishness )-您在多播套接字中设置的IP地址只是一个占位符,还是您真的必须将IP地址设置为占位符?我一半的人认为你可能不知道--另一半则在尖叫着相反的声音--但当我在谷歌上搜索答案时,我找不到任何东西来证实这一点--只是它必须是一个相当窄范围内的地址。如果我弄错了(我的IP是192.168.1.3),那是问题所在吗?或者是其他原因。
提前感谢
史蒂夫
发布于 2011-04-18 16:25:20
MulticastSocket及其joinGroup()用于接收组播数据包。发送组播报文与向群组地址发送普通UDP报文相同,需要为每个报文设置目的地址和端口:
packet = new DatagramPacket(buffer, buffer.length, group, 4446);
...
multisocket.send(packet);另请参阅:
MulticastSocket发布于 2011-04-18 16:34:53
他说的话。实际上,发送时根本不需要MulticastSocket或joinGroup():您可以使用常规的DatagramSocket来完成。但您必须在DatagramPacket中输入目的地址。此外,您的异常处理也是非常重要的。如果您在第一个try块中获得异常,则仍将继续执行第二个try块。所有这些代码都应该放在一个try块中。
发布于 2016-07-26 23:54:22
如果写入DatagramPacket.setAddress(...)的java.lang.NullPointerException: null buffer || null address未解析或格式错误,您也可以从发送调用收到相同的异常InetSocketAddress。
例如,考虑到通常的InetAddress.toString()格式,这看起来似乎是合理的,但事实并非如此:
DatagramPacket.setAddress(new InetSocketAddress("/239.193.129.14", 3450))https://stackoverflow.com/questions/5700078
复制相似问题