2012-12-12 57 views
0

我的數據報套接字不會拋出一個SocketTimeout,儘管它被設置,我不知道如何解決這個問題。代碼如下。問題是,如果它沒有收到沿這個套接字連接的任何消息,它將在第一次運行時超時。但是,它幾次成功接收到一條消息,稍後在調用.receive時不會超時。DatagramSocket不拋出SocketTimeout - Java

DatagramSocket serverSocket = new DatagramSocket(serverSyncPort); 
serverSocket.setSoTimeout(200); 

while(true) 
{ 
     receiveData = new byte[1024]; 
     receivePacket = new DatagramPacket(receiveData,receiveData.length); 
     try 
     { 
      serverSocket.receive(receivePacket); 
     } 
     catch(SocketTimeoutException e) {} 
} 
+0

有了這種異常處理,你怎麼可能告訴? – EJP

+0

這只是代碼的一部分。我把它在catch塊內輸出到控制檯 – user1620902

+0

我知道這真的很老,但你有沒有想過它? –

回答

0

javadocs

如果超時,將引發java.net.SocketTimeoutException,雖然DatagramSocket的是 仍然有效。 在進入阻止操作生效之前,必須啓用該選項。 超時值必須大於0.超時值爲零會被解釋爲無限超時。

檢查超時值是否正確啓用,如上述報價中突出顯示。

此外,稍後檢查getSoTimeout()的值,以驗證它是什麼。

+0

我已經在每次接收之前和之後檢查過它,它仍然在200,但它沒有超時,當它通過循環並沒有收到任何東西時... – user1620902

0

爲此DatagramSocket調用receive()將僅阻塞setockettimeout時間量。如果超時過期,則引發java.net.SocketTimeoutException,儘管DatagramSocket仍然有效。這裏200微秒設置爲超時,它應該工作。

您正在嘗試使用哪種環境?有可能這是Windows上的預期行爲,因爲SocketException在solaris/Linux環境中很好。

+0

setSoTimeout()適用於我知道的所有Java平臺的。否則它不會在那裏。 – EJP