给DatagramSocket的receive()方法添加超时功能

24

我需要在代码的这部分创建一个10秒的超时。

DatagramPacket getack = new DatagramPacket(incoming, incoming.length);
socket.receive(getack);

如果在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) {

    }

}
2个回答

43

对于您的示例,那应该可以工作。

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,这个会起作用吗? - Sterling Duchess
这段程序相关的内容应该是:我应该在getack = DatagramPacket()之前还是之后放置它? - Sterling Duchess
@kellax 我已经对我的帖子进行了编辑。在调用接收之前,您必须设置超时。 - sebastian
@Kellax 如果数据被接收,超时异常就不会被抛出。这显然是很明显的吧? - user207421

4
socket.setSoTimeout(10000);
socket.receive(getack);
socket.setSoTimeout(0);

1
@Rizier123:我英语不太好(我来自波兰),所以我只给出了代码。这可以代替相同的“socket.receive(getack)”。 - Bartosz Konkol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接