Tôi đã chạy một vài thử nghiệm với ổ cắm và gặp phải một số hành vi lạ: ServerSocket sẽ từ chối kết nối sau khi ổ cắm máy khách thứ 50 kết nối với nó, ngay cả khi ổ cắm máy khách đó đóng trước khi ổ cắm tiếp theo được mở ra, và thậm chí nếu độ trễ được thêm vào giữa các kết nối.Giới hạn kết nối Java ServerSocket?
Chương trình sau là mã thử nghiệm của tôi, ở trạng thái hiện tại, không có ngoại lệ và kết thúc bình thường. Tuy nhiên, nếu kích thước mảng của Socket[] clients
được tăng vượt quá 50, bất kỳ ổ cắm máy khách nào cố kết nối sau khi kết nối thứ 50 bị từ chối bởi ổ cắm máy chủ.
Câu hỏi: Tại sao số lượng kết nối ổ cắm bị từ chối bởi ổ cắm máy chủ?
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();
}
}
Tôi đã chạy thử nghiệm nơi khác 50 ổ cắm kết nối với một máy chủ cục bộ, và không có vấn đề xảy ra với 100 ổ cắm được mở ra và đóng lại, vì vậy tôi đã suy luận rằng các ổ cắm máy chủ của nó là từ chối kết nối, và không một số giới hạn mở ổ cắm máy khách, nhưng tôi đã không thể phát hiện tại sao ổ cắm máy chủ bị giới hạn ở 50 kết nối, mặc dù chúng không được kết nối đồng thời.
Các kết nối trong hàng đợi có bị xóa khi các ổ cắm máy khách bị đóng không? – Vulcan
@Vulcan Rõ ràng là không. – EJP
@EJP Vâng, nhưng tại sao họ lại không?Đối với tôi, có vẻ như kỳ quặc rằng các ổ cắm kín vẫn được xếp hàng đợi để kết nối. Tôi đoán rằng không có cách nào cho các ổ cắm máy chủ để biết rằng các ổ cắm khách hàng đóng cửa mặc dù. – Vulcan