【问题标题】:MulticastSocket receives message twiceMulticastSocket 接收消息两次
【发布时间】:2015-04-28 21:12:16
【问题描述】:

我通过 MulticastSocket 向 WIFI 接入点发送消息,并且总是得到两次回复。如果我尝试向自己发送消息,我会再次收到两次消息。这是我的接收器代码:

protected Void doInBackground(Void... params) {

                String lText;
                byte[] lMsg = new byte[GlobalConfig.MAX_UDP_DATAGRAM_LEN];
                DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);
                MulticastSocket ds = null;
                try {
                    ds = new MulticastSocket (32001);
                    InetAddress serverAddr = InetAddress.getByName("224.237.124.120");
                    ds.joinGroup(serverAddr);
                    while (serverActive) {

                        ds.receive(dp);
                        Log.d("UDP packet received", dp.toString());
                        lText = new String(lMsg, 0, dp.getLength());
                        receivedMessage = lText;
                        doSomething();

                    }
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (ds != null) {
                        ds.close();
                    }
                }
                return null;
            }

我尝试通过 DatagramSocket 和 MulticastSocket 发送 - 无论如何。我总是收到两次消息。我不明白为什么!

编辑:我的 LogCat:

I/GatewayController﹕ Message Sent
...

D/UDP packet received﹕ java.net.DatagramPacket@422dc860
D/UDP packet received﹕ java.net.DatagramPacket@422dc860

EDIT2:发件人代码

protected Void doInBackground(Void... params) {

                DatagramSocket ds = null;
                try {
                    ds = new DatagramSocket();
                    InetAddress serverAddr = InetAddress.getByName("224.237.124.120");
                    DatagramPacket dp;
                    dp = new DatagramPacket(byteMsg, byteMsg.length,
                            serverAddr, 32000);
                    ds.send(dp);

【问题讨论】:

  • 发件人代码是什么?
  • 此代码无法编译。端口号不是字符串。再试一次。贴出真实代码。
  • 这只是部分代码。实际上这是 AsyncTask (doInBackground...) 的一部分

标签: java android udp multicastsocket


【解决方案1】:

我尝试通过 DatagramSocket 和 MulticastSocket 发送 - 无论如何。我总是收到两次消息。我不明白为什么!

编辑:我的 LogCat:

I/GatewayController﹕ Message Sent ...
D/UDP packet received﹕ java.net.DatagramPacket@422dc860 D/UDP packet received﹕ java.net.DatagramPacket@422dc860

这并不能证明您收到了两次相同的消息。有证据表明您总是接收到相同的字节数组。尝试记录消息内容。

但是多播是 UDP,而 UDP 不保证交付、单一交付或顺序交付,因此您仍有可能得到重复。如果这在语义上很重要,您需要通过序列号来检测它。

【讨论】:

    【解决方案2】:

    这是正确的方法:

    InetAddress group = InetAddress.getByName(GlobalConfig.MULTICAST_IP);
    SocketAddress sockaddr = new InetSocketAddress(group,GlobalConfig.LOCAL_PORT);
    ds = new MulticastSocket(sockaddr);
    ds.joinGroup(group);
    

    这很重要,但在 Internet 的示例中很难找到:

    SocketAddress sockaddr = new InetSocketAddress(group,GlobalConfig.LOCAL_PORT);
    ds = new MulticastSocket(sockaddr);
    

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 2020-04-17
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 2022-10-09
      • 2017-11-10
      相关资源
      最近更新 更多