簡體   English   中英

Java SocketException:沒有可用的緩沖區空間

[英]Java SocketException: No buffer space available

我的java代碼使用多個線程,每個線程運行一個ServerSocket並進入接受。 這些線程使用java套接字相互通信。 121個線程都運行良好,但如果我用256個線程運行相同的代碼我有這個錯誤:

java.net.SocketException: No buffer space available (maximum connections reached?): listen failed
    at java.net.PlainSocketImpl.socketListen(Native Method)
    at java.net.PlainSocketImpl.listen(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)

我使用windows xp sp3,有幾個這樣的帖子( 這里 ),但是沒有人為這個問題發帖。 我還安裝了一個Windows補丁,以消除TCP連接的限制,但我沒有解決我的問題。

消息顯示您的連接可能已耗盡。 你檢查過了嗎? 您可以使用以下命令從命令行檢查打開的套接字:

netstat -n

確保關閉兩側的所有插座(最后一塊)。 請記住,收到連接后,偵聽套接字仍保持打開狀態。 不要太快打開和關閉套接字(我會說它們不能立即重用,這可能與你的問題有關)。

為了獲得更好的與套接字相關的性能,您可以使用java.nio API,但它比java.net復雜得多。

我認為這篇文章可能有你的答案。 離開懸空套接字會導致達到最大值(這可能是由Windows修補程序無法修復的其他設置(例如JVM限制?)決定的)

作為旁注,如果你使用那么多線程運行,那么使用java.nio而不是java的簡單Socket和ServerSocket類很可能會更好。

這個站點是一個非常好的教程,如何使用java.nio以及我如何學習它(以及查看Sun / Oracle的Java NIO API ),來自使用簡單的Socket和ServerSocket編程。

具體來說,有助於您的原因是使用Selector,它允許您以與C ++ select()調用與套接字一起使用的方式多路復用套接字I / O. 這意味着在套接字代碼的核心,您可以減少大量線程處理套接字I / O的影響,並且只有一個線程直接與套接字交互。

不知道你具體做什么使得這只是一個猜測,但我會提供這個以防其他人看到類似的問題。 嘗試打開太多OUTGOING連接時,我看到了這個錯誤。 通過減小緩沖區大小,您可以限制連接線程打開的連接數(當您達到緩沖區限制時,它們將被拒絕)。 如果您仍然獲得足夠的吞吐量,這是一個很好的解決方案。 但是,另一種解決方案是增加可用傳出連接的數量,這可以解決您的問題並提供更好的吞吐量。

為此,您可以添加/修改MaxUserPort的注冊表項。 使用regedit,找到HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ services \\ Tcpip \\ Parameters然后添加/ mod鍵:MaxUserPort鍵入DWORD,高值如65534(十進制)

一篇關於MaxuserPort的軟件科技文章

我通過更改ServerSocket調用解決了問題。 我的錯誤是將積壓值設置得太高。 我不需要那個服務器聽超過5-6連接。 我更換了:ServerSocket sock = new ServerSocket(port,500); 使用ServerSocket sock = new ServerSocket(port,10); 現在一切順利!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM