多服务器发现-Java/Android

多服务器发现-Java/Android,java,android,udp,broadcast,Java,Android,Udp,Broadcast,我有一个可以存在多个服务器的应用程序。有很多关于如何使用UDP发现服务器的示例,但这似乎只适用于单个服务器 如果存在多个响应,会发生什么?它们是排队、损坏(带有UDP陷阱)还是其他原因 我想了解如何从Android设备发送的UDP广播接收多个响应。如果这不可行,是否有其他推荐的方法用于Android客户端的多服务器发现 谢谢您应该执行以下操作以接收并可能发送广播数据包(这正是您所要求的): 确保网络掩码正确 绑定套接字时,请确保将其绑定到INADDR\U ANY 将套接字选项设置为通过setso

我有一个可以存在多个服务器的应用程序。有很多关于如何使用UDP发现服务器的示例,但这似乎只适用于单个服务器

如果存在多个响应,会发生什么?它们是排队、损坏(带有UDP陷阱)还是其他原因

我想了解如何从Android设备发送的UDP广播接收多个响应。如果这不可行,是否有其他推荐的方法用于Android客户端的多服务器发现


谢谢

您应该执行以下操作以接收并可能发送广播数据包(这正是您所要求的):

  • 确保网络掩码正确

  • 绑定套接字时,请确保将其绑定到INADDR\U ANY

  • 将套接字选项设置为通过
    setsockopt

  • 使用sendaddr.sin\u addr.s\u addr=inet\u addr(“您的接口\u广播\u地址”)调用函数sendto(..),或使用其广播IP地址为每个接口调用sento(..)数次

  • 在while(..)循环中调用函数recvfrom(..),直到确定“已经过了足够的时间”,通常在LAN网络上1秒就足够了


  • 如果您广播该消息,并且服务器都返回,那么您应该可以在返回时看到所有响应

    但是,请注意,UDP是一种潜在的有损协议,根本不提供任何保证。在非无线局域网上,使用合适的交换机是非常安全的,但一旦超过这个范围(无线、多网络等),您可能会丢失至少一些数据包,任何数据包丢失都是UDP上的消息丢失

    通常的解决方法是将每条消息发送几次。例如,当你第一次启动时,你可能会在1秒、10秒、30秒时广播,然后每隔10分钟广播一次。这将立即找到服务器,然后相当快地扫除丢失的任何服务器,最后检测网络上出现的任何新服务器

    我已经有好几年没有使用这种系统了,但上次我们使用时,只有一台服务器充当中心点。当中央服务器启动时,所有内容都广播出去以查找中央服务器(每隔一段时间重试,直到找到为止),当中央服务器启动时,所有内容都广播出去以查找所有内容-重试3次


    之后的所有通信都是通过向中央服务器注册并从那里获取应用程序列表等方式完成的。服务器实质上是一个网络目录,因此任何东西都可以通过查询它来获取网络上其他任何东西的列表。

    我会首先向所有你想询问它们是否在那里的服务器发送一个数据包,然后让所有服务器响应。既然您想了解如何接收包裹,下面是我的方法:

    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;
        }
    }
    
    long responseTimeout=4000;
    长启动=System.currentTimeMillis();
    while(true){
    long now=System.currentTimeMillis();
    如果(现在-开始<响应超时){
    datagramSocket.setSoTimeout((int)(responseTimeout-(now-start));
    }否则{
    打破
    }
    试一试{
    datagramSocket.receive(数据包);
    addOnlineServer(packet.getAddress());
    }捕获(SocketTimeoutException e){
    打破
    }
    }
    
    在一定的时间内,您的android客户端应该等待响应,并将收到的包的每个ip添加到在线服务器列表中


    确保在使用UDP时某些包可能会丢失,但这正是您得到的。如果您想确保没有包丢失,请改用TCP。

    james您是否同时在多个服务器中发送响应,对吗?您应该调查多播是否可用,如果可用,则使用它。UDP广播除ce外不推荐使用启动阶段的操作。@EJP-有意思,你能详细说明一下吗?我发现这显示了Android上的一个简单UDP示例,还包括一个Java服务器实现。感谢nrathaus。你认为如果在while循环中调用recvfrom,它应该会收到所有响应吗?即recvfrom函数下面有队列吗?调用recvfrom将在项目到达时接收它们,我建议在其中添加一个超时,这样您就不会永远等待,您可能知道发送多个广播时不会收到任何响应+1。所以您是说响应可能会被删除,但如果两个服务器响应,我应该至少得到一个响应?应该。我们应该这样做概率在这里。如果每条消息有99%的几率通过两条消息,但仍然有0.01%的几率没有通过…并且这种可能性会比你想象的更频繁。除非你有足够的服务器来淹没网络(极不可能)这些消息不会相互干扰。这里的关键是重试足够的次数,使失败的机会变得微不足道。