24

I need to create a 10 second timeout on this part of the code

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

I need it to listed for incoming packets for 10s if it receives a packet before 10s it would skip down to if statement in case it reaches 10s it would jump down to else and resend the packet. Is this possible and how could i do this iam pretty new to this.

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) {

    }

}
Some programmer dude
  • 400,186
  • 35
  • 402
  • 621
Sterling Duchess
  • 1,970
  • 16
  • 51
  • 91

2 Answers2

43

That should work for your example.

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...
}
sebastian
  • 2,427
  • 4
  • 32
  • 37
4
socket.setSoTimeout(10000);
socket.receive(getack);
socket.setSoTimeout(0);
  • 1
    @Rizier123 : I don't speak good English (I'm from Polish), so I gave only code. This can be used instead of same the 'socket.receive(getack);'. – Bartosz Konkol Dec 10 '14 at 12:30