【问题标题】:MulticastSocket keep listen functionMulticastSocket 保持监听功能
【发布时间】:2017-12-17 15:38:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: android sockets udp multicastsocket


    【解决方案1】:

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

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

    关闭套接字时,您所要做的就是关闭它。离开其所有多播组是自动的,断开也是如此,而且由于您从未连接过它,因此无需一开始就断开它。

    【讨论】:

    • 感谢您的回复,所以根据您的评论,我只需要将 finally 块从 while 循环中删除,并将初始化代码移动到只运行一次的地方,对吗?
    • 另外,正如你所说,重做这一切并不能解决互联网连接问题,所以一旦互联网连接断开,即使连接恢复,套接字也不会再监听?
    • 无论 Internet 连接是否进出,套接字仍然有效。
    猜你喜欢
    • 2020-11-11
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2021-12-01
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多