我正在研究基于UDP的套接字应用程序,在这里我对如何在接收端实现listen功能提出了一些问题
下面是让接收方套接字继续监听服务器端的好方法吗?假设我不知道服务器端何时将数据包发送到接收端,所以我需要始终保持接收功能。它会错过还是有些打破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;
}
}
如果我在一段时间内没有上网权限,上述方法是否已经解决,假设该方法总是会捕获到SocketTimeoutException对吗?但是当以后恢复互联网访问时,数据包到来时我还能继续听吗?
假设我从发送方那里得到了第一个数据包并执行了代码,但是发送方在那个时间发送了第二个数据包,我会错过这个数据包吗?由于第一个数据包的while循环没有结束。
以下是手动关闭套接字的好方法,并且重新连接'它呢?它会以某种方式绑定端口,并且不能再使用相同的端口来新建一个对象吗?如果这是正确的代码块,我应该将它们放在问题SocketTimeoutException
中吗?
udpsocket_receiving.leaveGroup(serverAddress);
udpsocket_receiving.disconnect();
udpsocket_receiving.close();
udpsocket_receiving = new MulticastSocket(SERVERPORT) ;
udpsocket_receiving.setSoTimeout(10000);
udpsocket_receiving.joinGroup(serverAddress);
答案 0 :(得分:1)
没有。您永远不会连接套接字,因此dpsocket_receiving.isConnected()
将永远不会成立。你不需要读循环中所有关闭/打开的废话。唯一一个关闭插座的人就是你。 SocketTimeoutException
表示在读取超时期限内未收到任何数据报。你做了什么取决于你,也许什么都没有,但它并不意味着你必须关闭并重新初始化套接字。重做所有这些都无法解决互联网连接问题。
您通常会错过数据包的唯一方法是它们是否被丢弃,但关闭并重新打开套接字会提供一个肯定会发生的窗口。不要这样做。
关闭套接字时,您只需将其关闭即可。保留所有多播组是自动的,断开连接,并且从未连接它,因此无需在第一个地方断开连接。