2011-12-29 65 views
1

下面的代碼可以重現該問題: INT errAt = -1;DatagramSocket類口岸後仍然使用關閉

try { 
    System.out.println("start..."); 
    for (int i = 0; i < 4000; i++) { 
     errAt = i; 
     DatagramSocket result = new DatagramSocket(null); 
     result.bind(new InetSocketAddress(InetAddress.getLocalHost(), 9005)); 
     result.close(); 
     //System.out.println(i); 
    } 

    } catch (Exception e) { 
    System.out.println("Error: " + e.getMessage()); 
    System.out.println("ErrAt: " + errAt); 
    e.printStackTrace(); 
    } finally { 
    System.out.println("end..."); 
    } 

在我的電腦,我會看到「java.net.BindException:地址已在使用:無法綁定」運行後異常2K +倍。

我不知道,就是這意味着close方法並沒有立即關閉本機插座?

回答

2

即使我將它設置爲運行40,000次迭代,此代碼也可以在我的Mac上運行。我認爲這裏可能存在的問題是,套接字沒有立即在Windows上關閉,但是您又試圖在可能的毫秒內進行數千次迭代。

下面的代碼將不斷重試和睡覺的少量時間,讓你看看它的延遲問題,在插座會的時間一定空間內被關閉:

long tCumulative = 0; 
    int errAt = -1; 
    System.out.println("start..."); 
    for (int i = 0; i < 4000; i++) { 
     try { 
      errAt = i; 
      DatagramSocket result = new DatagramSocket(null); 
      result.bind(new InetSocketAddress(InetAddress.getLocalHost(), 9005)); 
      result.close(); 

      //success at last 
      tCumulative = 0; 

     } catch (Exception e) { 
      System.out.println("Error (at="+errAt+") (waited="+tCumulative+"ms): " + e.getMessage()); 

      tCumulative+=50; 
      Thread.sleep(50); 
      i--; 
     } 
    } 
    System.out.println("end..."); 
+0

確實沒有在Windows上立即關閉套接字。 – 2011-12-29 05:48:25

+0

鑑於您可以在失敗之前運行代碼約2000次,可能最有可能的問題是關閉和重新綁定是一種競爭條件(即Windows非常快速地執行操作,但在2000次之後,您遇到了您在它關閉之前嘗試重新綁定),或者您的Windows資源不足,因爲它沒有足夠快地清除它們。你是否發現當它失敗時會等待一小段時間,然後在失敗之前或之後對另一個套接字工作正常,是否似乎必須等待一段時間才能關閉每個套接字? – AntonyM 2011-12-29 17:51:13

+0

我之所以問這個問題的原因是因爲如果它在大約2000個套接字後似乎失敗了,但是當你等待50ms之後再工作到另外2000個套接字時,那麼它可能只是一個競爭條件。如果它在2000個套接字之後失敗了,並且你發現你被限制爲可能每隔幾百毫秒或幾秒關閉和重新綁定一個套接字,那麼這就意味着Windows僅在超時之後才清理資源。如果它的第一個確定 - 你只需要等待+重試,如果它發生,如果第二你可能想要查找關於套接字清理的註冊表設置。請參閱代碼 – AntonyM 2011-12-29 17:56:07

1

如果創建套接字但隨後得到例如一個BindException你沒有關閉套接字。它應該在finally {}塊中關閉。

很難看出這個測試的重點。正常的UDP程序打開一個DatagramSocket並在整個過程中保持打開狀態。沒有一個理智的程序會通過數以千計的UDP套接字。

+0

。套接字已關閉。 – 2011-12-29 09:46:04

+1

@SunilKumarSahoo請親自看看代碼。如果bind()調用引發異常,則該套接字爲* not *關閉。 – EJP 2011-12-30 00:51:57

+0

@downvoters請解釋,除非你希望它被視爲純粹的網站破壞行爲。 – EJP 2012-10-03 12:04:54

相關問題