我愿意在我的安卓移动设备上创建一个服务器和客户端程序。设备在同一个wifi网络上相互通信,因此,必须实现一些简单的扫描机制——客户端电话通过某种广播搜索服务器电话。
我做了什么:
我的协议 - 客户端电话在 wifi 上广播消息端口p ,服务器侦听端口p。当服务器收到广播消息时,它会发回一条消息,从而向客户端发现自己。
我的代码 - 我在我的应用程序上打开了一个广播套接字,它发送一条广播消息。同时,我的 PC 上有一个 python 脚本,它可以监听和回复——我使用 python 以便我的测试更容易——PC 上的 Wireshark,我可以看到所有内容。
怎么了:
当我使用我的一部 Galaxy S 手机时,它可以工作并且我得到了回应。当我使用另一部 Galaxy S 手机时,它不起作用。
现在这就是我所知道的:工作的手机实际上有 Nexus ROM 版本。4.1.1 不能用的手机有2.3.3 普通galaxy ROM
python 代码表示它接收从两部手机发送的两个广播,并回复它们而不引发任何异常。
到目前为止,我一直认为问题可能是 1. 旧版本的手机。2. windows 防火墙 3. 路由器防火墙
所以我打开了 Wireshark,确实我看到两部手机都在发送他们的广播——它是在 Wireshark 上登录的。 但是python脚本只响应了第一个。 所以这就是为什么 1 和 3 无关紧要 - 如果路由器防火墙阻止了我的 UDP,我仍然会看到 python 服务器响应,与旧版本的手机相同。
为了摆脱 2 我只是禁用了 Windows 防火墙 - 仍然是同样的问题。
有谁知道为什么会发生这种影响?
谢谢!
编辑
我的python代码:
def scan(data, addr, sock):
print "received scan message:", data, addr
name = u"name".encode("utf-16-le")
data = "DISC" + short2bytes(len(name)) + name
print "sending back %s to %s" % (data, addr)
sock.sendto(data, addr)
if __name__ == "__main__":
sock = socket(AF_INET, SOCK_DGRAM)
sock.bind(('', UDP_PORT))
while 1:
data, addr = sock.recvfrom(1500)
print "received packet " + data
if data.startswith("SCAN"):
scan(data, addr, sock)
编辑2:
好的!似乎我的代码和协议确实有效。事实证明,2.3.3 手机存在一些严重的 ARP 问题。经过一些重置后,它可以完美运行!