MulticastSocket保持监听功能

时间:2017-07-13 03:03:10

标签: android sockets udp multicastsocket

我正在研究基于UDP的套接字应用程序,在这里我对如何在接收端实现listen功能提出了一些问题

  1. 下面是让接收方套接字继续监听服务器端的好方法吗?假设我不知道服务器端何时将数据包发送到接收端,所以我需要始终保持接收功能。它会错过还是有些打破while(true)循环?如果是的话,如何重新连接"并使listen循环再次活着?

    while(true){
    
        try{
         if ( udpsocket_receiving.isClosed() || !udpsocket_receiving.isConnected() ) {
    
                serverAddress = InetAddress.getByName(SERVERIP);
                udpsocket_receiving = new MulticastSocket(SERVERPORT) ;
                udpsocket_receiving.joinGroup(serverAddress);
                udpsocket_receiving.setSoTimeout(10000);
            }
            udpsocket_receiving.receive(recpacket);
            // Block of code to do with the packet
    
        } catch ( SocketTimeoutException e ) {
             // What suppose to do here if I catch this exception?
        } finally {
             udpsocket_receiving.close();
             continue;
        }
    }
    
  2. 如果我在一段时间内没有上网权限,上述方法是否已经解决,假设该方法总是会捕获到SocketTimeoutException对吗?但是当以后恢复互联网访问时,数据包到来时我还能继续听吗?

  3. 假设我从发送方那里得到了第一个数据包并执行了代码,但是发送方在那个时间发送了第二个数据包,我会错过这个数据包吗?由于第一个数据包的while循环没有结束。

  4. 以下是手动关闭套接字的好方法,并且重新连接'它呢?它会以某种方式绑定端口,并且不能再使用相同的端口来新建一个对象吗?如果这是正确的代码块,我应该将它们放在问题SocketTimeoutException中吗?

        udpsocket_receiving.leaveGroup(serverAddress);
        udpsocket_receiving.disconnect();
        udpsocket_receiving.close();
        udpsocket_receiving = new MulticastSocket(SERVERPORT) ;
        udpsocket_receiving.setSoTimeout(10000);
        udpsocket_receiving.joinGroup(serverAddress);
    

1 个答案:

答案 0 :(得分:1)

没有。您永远不会连接套接字,因此dpsocket_receiving.isConnected()将永远不会成立。你不需要读循环中所有关闭/打开的废话。唯一一个关闭插座的人就是你。 SocketTimeoutException表示在读取超时期限内未收到任何数据报。你做了什么取决于你,也许什么都没有,但它并不意味着你必须关闭并重新初始化套接字。重做所有这些都无法解决互联网连接问题。

您通常会错过数据包的唯一方法是它们是否被丢弃,但关闭并重新打开套接字会提供一个肯定会发生的窗口。不要这样做。

关闭套接字时,您只需将其关闭即可。保留所有多播组是自动的,断开连接,并且从未连接它,因此无需在第一个地方断开连接。