0

我试图让一个多播套接字在“服务器”应用程序上工作,它会在一堆安卓手机上吐出信息。负责设置套接字并发送一些数据的代码片段如下:

    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 地址设置为那个?我有一半人认为你可能不知道——另一半人在尖叫相反——但当我在谷歌上搜索答案时,我找不到任何可以证实的东西——只是它必须是一个相当窄范围内的地址。如果我弄错了(我的 IP 是 192.168.1.3),那是问题所在吗?或者是别的什么。

提前致谢

史蒂夫

4

3 回答 3

5

MulticastSocketjoinGroup()是关于接收多播数据包的。发送组播包和发送普通的UDP包到组地址是一样的,所以需要为每个包设置目的地址和端口:

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

也可以看看:

于 2011-04-18T08:25:19.660 回答
2

他说的。事实上,您根本不需要 MulticastSocket 或 joinGroup() 来发送:您可以使用常规 DatagramSocket 来完成。但是您必须将目标地址放入 DatagramPacket。您的异常处理也很重要。如果您在第一个尝试块中遇到异常,您仍将继续进行第二个尝试。所有这些代码都应该在一个try块中。

于 2011-04-18T08:34:53.207 回答
0

如果写入的内容未解析或格式错误,您也可以java.lang.NullPointerException: null buffer || null address从 send 调用中收到相同的异常。InetSocketAddressDatagramPacket.setAddress(...)

例如,考虑到通常的InetAddress.toString()格式,这看起来是合理的,但不是:

DatagramPacket.setAddress(new InetSocketAddress("/239.193.129.14", 3450))
于 2016-07-26T15:54:22.413 回答