Từ khóa ở đây (without closing the socket properly)
.
Sockets nên luôn luôn được mua lại và xử lý theo cách này:
final Socket socket = ...; // connect code
try
{
use(socket); // use socket
}
finally
{
socket.close(); // dispose
}
Ngay cả với biện pháp phòng ngừa này, bạn nên xác định timeouts ứng dụng, cụ thể đối với giao thức của bạn.
Trải nghiệm của tôi đã cho thấy, thật không may là bạn không thể sử dụng bất kỳ chức năng hết thời gian chờ nào của Socket (ví dụ: không có thời gian chờ cho thao tác ghi và thậm chí là hoạt động đọc).
Đó là lý do tại sao bạn cần một chuỗi cơ quan giám sát thực thi thời gian chờ ứng dụng của bạn và xử lý các ổ cắm không phản hồi trong một thời gian.
Một cách thuận tiện để thực hiện việc này là khởi tạo Socket và ServerSocket thông qua các kênh tương ứng trong java.nio. Ưu điểm chính của các ổ cắm như vậy là chúng có thể bị gián đoạn, theo cách đó bạn có thể đơn giản làm gián đoạn luồng mà giao thức socket và đảm bảo rằng socket được xử lý đúng cách.
Lưu ý rằng bạn nên thực thi thời gian chờ của ứng dụng ở cả hai bên vì nó chỉ là vấn đề thời gian và may mắn khi bạn có thể gặp phải các ổ cắm không hồi đáp.
Nguồn
2010-06-30 00:03:53
Tôi đã cố gắng sử dụng nó bằng cách ghi vào ổ cắm và thậm chí sau đó tôi không biết nếu khách hàng đã bị ngắt kết nối. – erotsppa