2012-04-07 11 views
9

サーバーにデータを送信してから、1分間の応答を待ってからソケットを閉じます。ソケット受信のタイムアウトを設定しました

どうすればよいですか?

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

ソケットで1分またはデータを使用できるようにする必要がありますか?あなたが1分を待つことを望むなら、私はsleep関数またはusleep関数を使います。これらは、継続する前に有効期限が切れます。データを待っている場合は、select関数を調べます。select関数は、データが到着するまで待つか、期限が切れるまでのどちらか早いほうを待つことができます。 – Glenn

+0

@Glenn睡眠は1分まで無駄になる可能性があります。 1秒後にデータが到着するとどうなりますか?あなたは読んでタイムアウトが*のために*、excactlyだとどう思いますか? – EJP

答えて

19

これを試すことができます。シナリオで必要に応じてソケットのタイムアウトを変更してください!このコードはメッセージを送信し、タイムアウトに達するまでメッセージの受信を待機します。

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

1秒は読み取りタイムアウトには余りにも短いです。このコードは、タイムアウトが発生するとすぐに 'break 'が存在しないため、' SocketException:socket closed'をスローします。すべての 'SocketExceptions'がソケットが閉じているわけではありません。 – EJP

8

あなたがDatagramSocket、またはSocketあなたが使用することができ、任意の詳細については

socket.setSoTimeout(1000); 
//the value is in milliseconds 

を使用している場合は、DatagramSocket javadocまたはSocket javadocで外観を撮影したはずです。

+1

'Socket.setSoTimeout'も存在します。 – EJP

+0

@EJP、ありがとう。答えを訂正しました。 – shibli049

1

EJPのコメントを明確にするために、これはSocketExceptionの原因となる "missing break"の意味です。

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(); 
関連する問題