socket setsotimeout read java sockets networking network-programming timeout

setsotimeout - socket timeout java



AdiciĆ³n de tiempo de espera a DatagramSocket-receive() (2)

Necesito crear un tiempo de espera de 10 segundos en esta parte del código

DatagramPacket getack = new DatagramPacket (entrante, entrante.longitud);
socket.receive (getack);

Lo necesito para que aparezca en la lista de paquetes entrantes durante 10 s. Si recibe un paquete antes de los 10 s, saltará a la instrucción if, en caso de que alcance los 10 s, saltaría a else y reenviaría el paquete. ¿Es esto posible y cómo podría hacer esto? Soy bastante nuevo en esto.

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


Eso debería funcionar para tu ejemplo.

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


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