MulticastSocket保持监听功能

MulticastSocket keep listen function

我正在开发基于 UDP 的套接字应用程序,在这里我遇到了一些关于如何在接收端实现监听功能的问题

  1. 下面是让接收方套接字保持监听服务器端的好方法吗?假设我不知道服务器端什么时候将数据包发送到接收端,所以我需要保持接收功能始终打开。它会错过或以某种方式打破 while(true) 循环吗?如果是,如何"reconnect" 并使监听循环再次激活?

    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);
    

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

您通常会错过数据包的唯一方法是它们被丢弃,但是关闭并重新打开套接字提供了一个 window 肯定会发生的情况。别这样。

关闭套接字时,您只需将其关闭即可。离开它的所有多播组是自动的,断开连接也是如此,并且由于您从未连接过它,因此无需在第一时间断开它。