向 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()的主要内容,如果未能解决你的问题,请参考以下文章

如何向 FLTK 弹出对话框添加超时

Java中的DatagramPacket与DatagramSocket的初步

DatagramSocket 广播行为(Windows 与 Linux)

12.7-全栈Java笔记:Java网络编程

Java UDP STUN 打孔与 DatagramSocket

在Java中的datagramsocket中获取源的IP地址