2012-04-07 16 views
9

Quiero enviar datos al servidor, luego esperar una respuesta por un minuto y luego cerrar el socket.establecer el tiempo de espera para el socket recibir

¿Cómo hacerlo?

DatagramPacket sendpack = new ......; 
socket.send(pack); 
DatagramPacket recievepack = new .....; 
//wait 1 minute{ 
socket.recieve(buf); 
//wait 1 minute} 
socket.close(); 
+0

¿Necesita esperar un minuto o los datos están disponibles en el zócalo? Si quieres esperar un minuto entero, usaría la función de dormir o dormir. Estos serán por el período de tiempo para caducar antes de continuar. Si está esperando datos, buscaría en la función de selección, que le permitirá esperar que lleguen los datos o un período de tiempo para caducar, lo que ocurra primero. – Glenn

+0

@Glenn El sueño podría perder hasta un minuto. ¿Qué pasa si los datos llegan después de un segundo? ¿Qué crees que los tiempos de espera de lectura son * para *, por ejemplo? – EJP

Respuesta

19

Puede intentar esto. ¡Cambie el tiempo de espera del socket como se requiere en su escenario! ¡Este código enviará un mensaje y luego esperará para recibir mensajes hasta que se alcance el tiempo de espera!

DatagramSocket s; 

    try { 
     s = new DatagramSocket(); 
     byte[] buf = new byte[1000]; 
     DatagramPacket dp = new DatagramPacket(buf, buf.length); 
     InetAddress hostAddress = InetAddress.getByName("localhost"); 

     String outString = "Say hi";  // message to send 
     buf = outString.getBytes(); 

     DatagramPacket out = new DatagramPacket(buf, buf.length, hostAddress, 9999); 
     s.send(out);  // send to the server 

     s.setSoTimeout(1000); // set the timeout in millisecounds. 

     while(true){  // recieve data until timeout 
      try { 
       s.receive(dp); 
       String rcvd = "rcvd from " + dp.getAddress() + ", " + dp.getPort() + ": "+ new String(dp.getData(), 0, dp.getLength()); 
       System.out.println(rcvd); 
      } 
      catch (SocketTimeoutException e) { 
       // timeout exception. 
       System.out.println("Timeout reached!!! " + e); 
       s.close(); 
      } 
     } 

    } catch (SocketException e1) { 
     // TODO Auto-generated catch block 
     //e1.printStackTrace(); 
     System.out.println("Socket closed " + e1); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

Un segundo es demasiado corto para un tiempo de espera de lectura. Este código arrojará 'SocketException: socket closed' tan pronto como se produzca un tiempo de espera, debido a un' break 'faltante. No todas las 'SocketExceptions' significan que el socket está cerrado. – EJP

1

Para aclarar el comentario de EJP, esto es lo que quiso decir con "falta break" que causa una excepción SocketException.

String group = "224.0.0.0"; 
int port = 5000; 

MulticastSocket recvSock = new MulticastSocket(port); 
recvSock.joinGroup(InetAddress.getByName(group)); 
recvSock.setSoTimeout(1000); 

while(true) { 
    try { 
     recvSock.receive(in);    
    } catch (SocketTimeoutException e) { 
     break; // Closing here would cause a SocketException 
    } 
} 

// Move the close() outside the try catch bloock 
recvSock.leaveGroup(InetAddress.getByName(group)); 
recvSock.close(); 
Cuestiones relacionadas