向 DatagramSocket 添加超时-receive()
Posted
技术标签:
【中文标题】向 DatagramSocket 添加超时-receive()【英文标题】:Adding timeout to DatagramSocket - receive() 【发布时间】:2012-09-03 23:48:26 【问题描述】:我需要在这部分代码上创建一个 10 秒的超时时间
DatagramPacket getack = new DatagramPacket(incoming, incoming.length); socket.receive(getack);
我需要它列出 10 秒的传入数据包,如果它在 10 秒之前收到一个数据包,它将跳到 if 语句,以防它达到 10 秒,它会跳到 else 并重新发送数据包。这可能吗?我怎么能这样做?我对此很陌生。
private static void sendDATA()
outgoing = new byte[512]; // Empty array
try
ByteBuffer sDATA = ByteBuffer.allocate(516);
// 512 - 2 byte opcode, 2 byte block #, 512 data
DatagramPacket data = new DatagramPacket(outgoing, outgoing.length, InetAddress.getByName(clientip), clientport);
InputStream fis = new FileInputStream(new File(FILE));
int a;
int block = 1;
while((a = fis.read(outgoing,0,512)) != -1)
data.setLength(a);
sDATA.put((byte)3);
sDATA.put((byte)block);
sDATA.put(outgoing);
socket.send(data);
while(true)
DatagramPacket getack = new DatagramPacket(incoming, incoming.length);
socket.receive(getack);
if(incoming[0] == 3 && incoming[1] == block)
break;
else
socket.send(data);
catch (Exception e)
【问题讨论】:
【参考方案1】:这应该适用于您的示例。
socket.setSoTimeout(10000);
while(true)
DatagramPacket getack = new DatagramPacket(incoming, incoming.length);
try
socket.receive(getack);
catch (SocketTimeoutException e)
// resend
socket.send(data);
continue;
// check received data...
【讨论】:
嗯,我看了看,但我想知道这是否会像我的意思那样工作。这是否适用于如果在 10 秒之前收到某些内容则跳到 if 并且如果达到超时则跳到 else 的原理? 我也把它放在 getack = DatagramPacket(); 之前或之后; @kellax 我已经对我的帖子进行了编辑。您必须在调用接收之前设置超时。 @Kellax 如果收到数据,则不会抛出超时异常。这肯定很明显吗?【参考方案2】:socket.setSoTimeout(10000);
socket.receive(getack);
socket.setSoTimeout(0);
【讨论】:
@Rizier123 :我的英语说得不好(我来自波兰),所以我只给出了代码。这可以用来代替'socket.receive(getack);'。以上是关于向 DatagramSocket 添加超时-receive()的主要内容,如果未能解决你的问题,请参考以下文章
Java中的DatagramPacket与DatagramSocket的初步
DatagramSocket 广播行为(Windows 与 Linux)