2012-12-14 75 views
1

我正在實施一個客戶端服務器程序,並希望我的客戶端在等待5秒後沒有收到來自服務器的應答,發回相同的數據包...如何知道我們是否收到DatagramPacket的東西?

我是這樣做的,所以請告訴我,如果它的好..

dp = new DatagramPacket(packet , packet.length , host , port); 
     sock.send(dp); 
     time = System.currentTimeMillis(); 
     while ((System.currentTimeMillis() - time < 5000) && ack_dp.getLength() == 0) { 
      sock.receive(ack_dp); 
     } 

     if (ack_dp.getLength() == 0) 
      sock.send(dp); 

所以我計劃將等待5秒ACK,如果他不接受任何東西,他會重新發送相同的數據包。我檢查他是否收到包的長度ack或不包含..如果它保持爲0,那麼他沒有收到任何東西..如果它將比0長,然後從while序列中發送一個新的包..( PS:ack_dp是2字節)

回答

3

插座將默認塊,所以你的循環沒有意義在這裏(即使插座設置爲無阻塞,這是一個壞主意TM到busy-等待99.99%的情況)。

使用setSoTimeout(),並捕獲SocketTimeoutException

+0

這是UDP套接字的情況嗎?我不確定這一點,如果UDP接收套接字'塊,如果他們沒有收到任何東西.. – ZelelB

+1

是的,它阻止。請閱讀精細手冊 - http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html#receive(java.net.DatagramPacket) –

+0

以及如何查看我的數據包是空的還是不是?是否可以使用packet_name.getLength()? – ZelelB

相關問題