2012-04-07 9 views
9

Ich möchte Daten an den Server senden, warten Sie auf eine Antwort für eine Minute und schließen Sie dann den Sockel.Set Timeout für Socket empfangen

Wie geht das?

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

Müssen Sie eine Minute warten oder Daten auf dem Sockel verfügbar sein? Wenn Sie eine ganze Minute warten möchten, würde ich die Schlaf- oder die Schlaffunktion verwenden. Diese werden für die Zeit ablaufen, bevor sie fortfahren. Wenn Sie auf Daten warten, würde ich in die Select-Funktion schauen, die es Ihnen erlaubt, auf Daten zu warten oder einen Zeitraum ablaufen zu lassen, je nachdem, was zuerst eintritt. – Glenn

+0

@Glenn Der Schlaf könnte bis zu einer Minute verschwenden. Was passiert, wenn die Daten nach einer Sekunde eintreffen? Was denkst du gelesene Timeouts sind * für *, genau? – EJP

Antwort

19

Sie können dies versuchen. Ändern Sie das Timeout des Sockets wie in Ihrem Szenario erforderlich! Dieser Code sendet eine Nachricht und wartet dann auf den Empfang von Nachrichten, bis das Timeout erreicht ist!

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

Eine Sekunde ist viel zu kurz für ein Lese-Timeout. Dieser Code wird 'SocketException: socket closed 'auslösen, sobald eine Zeitüberschreitung auftritt, weil" break "fehlt. Nicht alle SocketExceptions bedeuten, dass der Socket geschlossen ist. – EJP

1

Um EJP's Kommentar zu verdeutlichen, meinte er das mit einer "fehlenden break", die eine SocketException verursacht.

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();