【问题标题】:Why sometimes android device receives own message为什么有时android设备会收到自己的消息
【发布时间】:2014-07-10 14:42:04
【问题描述】:

我有安卓设备

此代码我向服务器发送消息:

DatagramPacket sentPacket = new DatagramPacket(MESSAGE.getBytes(), MESSAGE.length(), getBroadcastAddress(), DISCOVERY_PORT); 
mSocket.send(sentPacket);

此代码我从服务器收到消息:

    receivedPacket = new DatagramPacket(buffer, buffer.length);
    mSocket.receive(receivedPacket);

一切正常,但有时我会收到我之前发送的消息。但是服务器显示正确的发送数据。

有人知道这个问题吗?

【问题讨论】:

    标签: android sockets udp


    【解决方案1】:

    您正在广播数据包,因此您正在通过网络接口将其取回。

    您是否尝试根据源 IP 过滤接收到的数据包? (如果源IP是自己,丢包)

    请参阅this question 了解更多信息。

    编辑:对于你的情况:

    receivedPacket = new DatagramPacket(buffer, buffer.length);
    mSocket.receive(receivedPacket);
    
    String sourceIp = receivedPacket.getAddress().getHostAdress();
    if(sourceIp != myIp) handle(receivedPacket);
    

    【讨论】:

    • 我不使用过滤,但我会看这边
    • 查看我的编辑:我不是在谈论任何太复杂的事情。只需检查 IP 地址,如果它与您的匹配,您就不会对收到的数据包执行任何操作。
    【解决方案2】:

    你必须使用套接字吗?

    为什么不使用 GCM? enter link description here

    它最适合 Android 解决方案。我试图用套接字来实现它,但有很多问题。例如,您必须创建一个服务,并设置一个持续通知以将该服务持久化在内存中。

    【讨论】:

    • 如果我们谈论的是 LAN 上的客户端/服务器应用程序怎么办?那么 GCM 不是解决方案。 GCM 根本不是套接字的替代品。
    • @RobinEisenberg 好的!这就是为什么我问你是否必须使用套接字。就我而言,我也必须在 LAN 中实现通信。套接字给我带来了并发性和多用户问题(不知道这是否适用于您),我决定采用一个丑陋的解决方案(但工作起来就像一个魅力),这是一个带有线程轮询消息的服务类和 web 服务.
    • 实际上,如果你正确地穿线,我看不出为什么我会建议不使用套接字。困难在于正确的并发访问和线程。如果这些都做得好,没有什么能阻止你在 Android 中通过 Socket 进行通信。但是,在这种情况下,取消对 GCM 的签名意味着您的消息在不需要时通过 WAN 层。从性能的角度来看,这是成本。
    • 因为套接字需要打开的连接。以及管理所有连接的服务器。它也是一种民意调查方法......所以我去了 WS 让它更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多