Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向DatagramSocket-receive()添加超时_Java_Sockets_Networking_Network Programming_Timeout - Fatal编程技术网

Java 向DatagramSocket-receive()添加超时

Java 向DatagramSocket-receive()添加超时,java,sockets,networking,network-programming,timeout,Java,Sockets,Networking,Network Programming,Timeout,我需要在这部分代码上创建一个10秒的超时 DatagramPacket getack=新的DatagramPacket(传入,传入.length) socket.receive(getack) 我需要它列出10秒的传入数据包,如果它在10秒之前收到一个数据包,它将跳到if语句,如果它达到10秒,它将跳到else并重新发送数据包。这可能吗?我怎么能做到呢?我对这个很陌生 private static void sendDATA() { outgoing = new byte[512]; /

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

DatagramPacket getack=新的DatagramPacket(传入,传入.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) {

    }

}

这应该适用于你的例子

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我已经对我的帖子进行了编辑。您必须在调用receive之前设置超时。@Kellax如果收到数据,则不会引发超时异常。这是显而易见的吗?@Rizier123:我英语说得不好(我来自波兰语),所以我只给出了代码。这可以代替“socket.receive(getack);”使用。
socket.setSoTimeout(10000);
socket.receive(getack);
socket.setSoTimeout(0);