向DatagramSocket添加超时 - receive()

时间:2012-09-11 05:07:12

标签: java sockets networking network-programming timeout

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

  

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

我需要列出10s的传入数据包,如果它在10s之前接收到一个数据包,它将跳过if语句,如果它达到10s,它将跳转到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 个答案:

答案 0 :(得分:35)

这应该适用于你的例子。

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...
}

答案 1 :(得分:0)

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