我正在使用套接字運行一些測試,而且我遇到了一些奇怪的行爲:即使客戶端套接字在下一個套接字打開之前關閉,ServerSocket將在第50個客戶端套接字連接到套接字後拒絕連接,即使在連接之間添加延遲。Java ServerSocket連接限制?
以下程序是我的實驗代碼,它在當前狀態下不會拋出異常並正常終止。但是,如果Socket[] clients
的陣列大小增加到50以上,則在第50次連接後試圖連接的任何客戶端套接字都會被服務器套接字拒絕。
問題:爲什麼50套接字連接被服務器套接字拒絕的計數?
public static void main(String[] args) {
try (ServerSocket server = new ServerSocket(2123)) {
Socket[] clients = new Socket[50];
for (int i = 0; i < clients.length; i++) {
clients[i] = new Socket("localhost", 2123);
System.out.printf("Client %2d: " + clients[i] + "%n", i);
clients[i].close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
我已經運行在那裏另外50座連接到另一臺本地服務器的測試,並與發生在打開和關閉100座沒有問題,所以我推斷,它的服務器套接字拒絕連接,而不是一些開放客戶端套接字的限制,但我一直無法發現爲什麼服務器套接字限制爲50個連接,即使它們沒有同時連接。
當客戶端套接字關閉時,隊列中的連接不會被刪除嗎? – Vulcan
@Vulcan顯然不是。 – EJP
@EJP是的,但他們爲什麼不呢?對我來說,閉合套接字仍然排隊等待連接似乎很奇怪。我想服務器套接字無法知道客戶端套接字是封閉的。 – Vulcan