2012-04-07 27 views
9

Tôi muốn gửi dữ liệu đến máy chủ, sau đó đợi câu trả lời trong một phút và sau đó đóng socket.đặt thời gian chờ cho socket nhận được

Cách thực hiện?

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

Bạn có cần đợi một phút hoặc dữ liệu có sẵn trên ổ cắm không? Nếu bạn muốn chờ một phút, tôi sẽ sử dụng chức năng ngủ hoặc ngủ. Những điều này sẽ cho khoảng thời gian hết hạn trước khi tiếp tục. Nếu bạn đang chờ dữ liệu, tôi sẽ xem xét chức năng chọn, điều này sẽ cho phép bạn đợi dữ liệu đến hoặc một khoảng thời gian hết hạn, tùy điều kiện nào đến trước. – Glenn

+0

@Glenn Giấc ngủ có thể lãng phí tới một phút. Nếu dữ liệu đến sau một giây thì sao? Bạn nghĩ thời gian chờ đọc là gì * cho *, một cách tuyệt vời? – EJP

Trả lời

19

Bạn có thể thử điều này. Thay đổi thời gian chờ của ổ cắm theo yêu cầu trong kịch bản của bạn! Mã này sẽ gửi một tin nhắn và sau đó chờ để nhận tin nhắn cho đến khi hết thời gian chờ!

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

Một giây là quá ngắn đối với thời gian chờ đã đọc. Mã này sẽ ném 'SocketException: socket closed' ngay sau khi hết thời gian chờ, vì thiếu' break'. Không phải tất cả 'SocketExceptions' có nghĩa là socket được đóng lại. – EJP

8

Nếu bạn đang sử dụng DatagramSocket, hoặc Socket bạn có thể sử dụng,

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

Đối với bất kỳ chi tiết, bạn nên mang theo một cái nhìn trong DatagramSocket javadoc hoặc Socket javadoc.

+1

'Socket.setSoTimeout' cũng tồn tại. – EJP

+0

@EJP, cảm ơn. Đã sửa câu trả lời. – shibli049

1

Để làm rõ nhận xét của EJP, đây là ý nghĩa của từ "thiếu break" gây ra một 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(); 
Các vấn đề liên quan