Lớp Java Socket
có hai phương pháp isClosed
và isConnected
để kiểm tra xem ổ cắm có được đóng hoặc được kết nối tương ứng hay không. Tôi muốn biết sự khác biệt giữa một socket TCP mà chỉ mở và một socket TCP được mở và kết nối, và điều này khác với UDP như thế nào.Whats sự khác biệt giữa một ổ cắm được mở và một ổ cắm được kết nối là gì?
Trả lời
Để đặt mọi thứ đơn giản, Socket
là mở là một ổ cắm đang chờ kết nối hoặc đã kết nối thành công với một số Socket
khác. Khi một ổ cắm đã được đóng, điều đó có nghĩa là ổ cắm này không còn có sẵn để kết nối và rằng tài nguyên của nó đã được phát hành. A Socket
được kết nối, tốt, có nghĩa là ổ cắm được kết nối với một ổ cắm khác Socket
.
Vì vậy, một lon Socket
..
- cởi mở và kết nối cùng một lúc.
- mở và không được kết nối cùng một lúc.
- không được kết nối khi đóng.
CẬP NHẬT
từ @Bryan
Rõ ràng, có khép hờ hoặc half-open bang cho TCP Sockets; sử dụng nào (hôm nay) khác với ý nghĩa ban đầu của nó. Thêm thông tin về số này link.
Trang này cung cấp tổng quan khá tốt về trạng thái ổ cắm: http://diranieh.com/SOCKETS/SocketStates.htm và sự khác biệt giữa ổ cắm TCP và UDP. Cụ thể:
- Trạng thái "Mở" (TCP và UDP): Ổ cắm chưa đặt tên đã được tạo. Một ổ cắm chưa đặt tên là ổ cắm không bị ràng buộc vào địa chỉ cục bộ và cổng
- Trạng thái "Đã kết nối" (chỉ TCP): Một liên kết (mạch ảo) đã được thiết lập giữa máy chủ cục bộ và từ xa. Gửi và nhận dữ liệu hiện có thể.
Lưu ý rằng các triển khai mới hơn của java.net.DatagramSocket hỗ trợ phần mở rộng cho trạng thái mạng TCP/IP: Một DatagramSocket cũng có thể ở trạng thái "được kết nối", vì vậy isConnected() không nhất thiết trả về false mặc dù một ổ cắm datagram không bao giờ được "kết nối" ở lớp mạng. Cụ thể: "Khi một DatagramSocket được kết nối với một địa chỉ từ xa, các gói chỉ có thể được gửi đến hoặc nhận được từ địa chỉ đó. Theo mặc định, một ổ cắm datagram không được kết nối."
+1 cho sự đơn giản nhưng rõ ràng –
Không làm lẫn lộn mọi thứ, nhưng TCP cũng có trạng thái nửa đóng khi vẫn còn kết nối nhưng giờ đây là một chiều. –