MulticastSocket保持监听功能
MulticastSocket keep listen function
我正在开发基于 UDP 的套接字应用程序,在这里我遇到了一些关于如何在接收端实现监听功能的问题
下面是让接收方套接字保持监听服务器端的好方法吗?假设我不知道服务器端什么时候将数据包发送到接收端,所以我需要保持接收功能始终打开。它会错过或以某种方式打破 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;
}
}
如果我有一段时间没有上网,上面的方法是否已经解决了,假设该方法总是会捕获到 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);
没有。您永远不会连接套接字,因此 dpsocket_receiving.isConnected()
永远不会成立。您不需要读取循环中的所有 closed/open 废话。唯一要关闭插座的人就是你。 SocketTimeoutException
表示在读取超时期限内没有收到数据报。你对此做什么取决于你,也许什么都不做,但这并不意味着你必须关闭并重新初始化套接字。重做所有这些不会解决 Internet 连接问题。
您通常会错过数据包的唯一方法是它们被丢弃,但是关闭并重新打开套接字提供了一个 window 肯定会发生的情况。别这样。
关闭套接字时,您只需将其关闭即可。离开它的所有多播组是自动的,断开连接也是如此,并且由于您从未连接过它,因此无需在第一时间断开它。
我正在开发基于 UDP 的套接字应用程序,在这里我遇到了一些关于如何在接收端实现监听功能的问题
下面是让接收方套接字保持监听服务器端的好方法吗?假设我不知道服务器端什么时候将数据包发送到接收端,所以我需要保持接收功能始终打开。它会错过或以某种方式打破 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; } }
如果我有一段时间没有上网,上面的方法是否已经解决了,假设该方法总是会捕获到 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);
没有。您永远不会连接套接字,因此 dpsocket_receiving.isConnected()
永远不会成立。您不需要读取循环中的所有 closed/open 废话。唯一要关闭插座的人就是你。 SocketTimeoutException
表示在读取超时期限内没有收到数据报。你对此做什么取决于你,也许什么都不做,但这并不意味着你必须关闭并重新初始化套接字。重做所有这些不会解决 Internet 连接问题。
您通常会错过数据包的唯一方法是它们被丢弃,但是关闭并重新打开套接字提供了一个 window 肯定会发生的情况。别这样。
关闭套接字时,您只需将其关闭即可。离开它的所有多播组是自动的,断开连接也是如此,并且由于您从未连接过它,因此无需在第一时间断开它。