Java MulticastSocket导致空指针异常

时间:2011-04-18 08:03:41

标签: 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地址设置为该地址?我有一半认为你可能不这样做 - 另一半是尖叫相反的 - 但我在谷歌搜索答案时找不到任何确认 - 只是它必须是一个相当狭窄范围内的地址。如果我错了(我的IP是192.168.1.3),那么问题是什么?或者是别的什么。

提前致谢

史蒂夫

3 个答案:

答案 0 :(得分:4)

MulticastSocket及其joinGroup()是关于接收多播数据包的。发送组播数据包与将常规UDP数据包发送到组地址相同,因此需要为每个数据包设置目标地址和端口:

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

另见:

答案 1 :(得分:1)

他说的话。事实上,您根本不需要MulticastSocket或joinGroup()来发送:您可以使用常规DatagramSocket来完成它。但是你必须将目标地址放入DatagramPacket。你的异常处理也是极点。如果在第一个try块中出现异常,则表示仍在继续执行第二个try块。所有这些代码都应该在单个 try块中。

答案 2 :(得分:0)

如果写入java.lang.NullPointerException: null buffer || null address的{​​{1}}未解决或格式错误,您也可以从发送呼叫中收到相同的异常InetSocketAddress

例如,考虑到通常的DatagramPacket.setAddress(...)格式,这似乎是合理的,但不是:

InetAddress.toString()