我有一个可以存在多个服务器的应用程序。有很多关于如何使用UDP来发现服务器的例子,但似乎只适用于单个服务器。
如果存在多个回复会怎样?它们是否排队,损坏(有UDP陷阱)或其他什么?
我想了解如何从Android设备发送的UDP广播中接收多个响应。如果这不可行,是否有任何其他推荐的方法用于Android客户端的多服务器发现..
谢谢
答案 0 :(得分:6)
我会首先将数据包发送给您想要询问的所有服务器,然后让所有服务器响应。由于您想了解如何接收包,以下是我将如何做到这一点:
long responseTimeout = 4000;
long start = System.currentTimeMillis();
while(true){
long now = System.currentTimeMillis();
if(now - start < responseTimeout){
datagramSocket.setSoTimeout((int) (responseTimeout - (now - start));
}else{
break;
}
try{
datagramSocket.receive(packet);
addOnlineServer(packet.getAddress());
}catch(SocketTimeoutException e){
break;
}
}
在一段时间内,您的Android客户端应该等待响应,并将收到的包的每个ip添加到在线服务器列表中。
当你使用UDP时,当然有些软件包可能会丢失,但这就是你得到的。如果您想确保没有包丢失,请改用TCP。
答案 1 :(得分:4)
如果您广播消息并且所有服务器都返回,您应该看到所有回复。
但请注意,UDP是一种潜在的有损协议,根本不做任何保证。通过具有良好交换机的非无线LAN,它是非常安全的,但是只要它超过(无线,多个网络等),您可能会丢失至少一些数据包,并且任何数据包丢失都是UDP上的消息丢失
通常的解决方案是每次发送几条消息。因此,例如,当您第一次启动时,您可以在1秒,10秒,30秒,然后每10分钟播放一次。这将立即找到服务器,然后快速扫描任何错过的服务器,然后最终检测出现在网络上的任何新服务器。
我已经很多年没有使用过这种系统了,但是上次我们这样做时只有一台服务器作为中心点。当它启动时,所有的东西都被广播以找到中央服务器(在增加的时间间隔内重试,直到找到它为止),当中央服务器启动时,它会广播出去寻找所有内容 - 重试3次。
之后的所有通信都是通过注册该中央服务器并从那里获取应用程序列表等来完成的。服务器本质上充当网络目录,因此任何东西都可以通过查询获得网络上任何其他内容的列表。
答案 2 :(得分:0)
您应该执行以下操作来接收并可能还发送广播数据包(这是您要求的):
确保网络掩码正确
绑定套接字时,请务必将其绑定到INADDR_ANY
通过setsockopt
使用sendaddr.sin_addr.s_addr = inet_addr("your_interface_broadcast_address")
调用函数sendto(..),或者使用广播IP地址为每个接口多次调用sento(..)。
在while(())循环中调用函数recvfrom(..),直到您确定“已经过了足够的时间”,通常1秒就足够在LAN网络上