Tôi có một ứng dụng Client/Server đơn giản. Máy chủ được thiết lập sao cho nếu không có dữ liệu đến trong vòng N giây, thời gian chờ xảy ra và kết nối ổ cắm bị đóng. Tôi làm điều này thông qua Socket.setSoTimeout(). Đó là tất cả các công trình tốt nếu khách hàng treo cứng. Nếu khách hàng chết, mặc dù (ví dụ: tôi giết nó bằng Ctrl-C), sau đó readLine() không bao giờ hết giờ.Trong Java, tại sao readLine() chặn trên một kết nối socket đóng?
Dưới đây là mã máy chủ, nếu mà làm cho một sự khác biệt:
public void run()
{
PrintWriter out = null;
BufferedReader in = null;
try {
sock.setSoTimeout(10000);
out = new PrintWriter(sock.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
String input;
while ((input = in.readLine()) != null) {
tôi đã cố gắng đưa vào một handler tín hiệu vào khách hàng để gửi một tin nhắn Abend trên máy chủ nhưng điều đó không làm việc (tôi nghi ngờ socket được đóng trước khi ABEND được gửi đi, nhưng tôi đã không thực sự dành thời gian để cố gắng tìm ra điều đó).
Có cách nào để thức dậy theo định kỳ và kiểm tra trạng thái ổ cắm để xem nó có bị đóng không? Hoặc (tốt hơn) không có readLine() treo nếu socket đóng? Tôi có nên sử dụng một trình đọc không bị chặn không? Có một trình đọc không có bộ đệm hỗ trợ một cơ chế giống như readLine tồn tại không?
Tôi đang sử dụng Java 6 trên Linux.
CHỈNH SỬA: Tôi đang tự mình giết chính khách hàng trong thời gian không hoạt động; tất cả dữ liệu đã được gửi và nhận tại thời điểm này. Tôi đã xác minh (thông qua ps) rằng chương trình khách hàng không còn chạy; quá trình Java đã thực sự bị giết. Sử dụng netstat tôi có thể thấy rằng socket được đóng, trên cả hai đầu, nhưng readLine() vẫn bị treo.
xem http://stackoverflow.com/questions/1577719/java-sockets-bufferedreader-and-readline-hang - có lẽ khách hàng đã bị giết ngay sau khi CR được gửi và readLine() không bao giờ tiêu thụ LF, do đó, nó choáng váng vì nó mãi mãi – mantrid
Tôi đang tự giết bản thân khách hàng trong một thời gian nhàn rỗi; tất cả dữ liệu đã được gửi và nhận tại thời điểm này. –
Loại Socket nào? TCP hoặc UDP? – ecbrodie