2011-12-13 12 views
9

Bạn có biết cách để ngắt đọc từ một Java InputStream mà không đóng chốt kết nối không?Bất kỳ cách nào để sử dụng java.nio. * Để ngắt một InputStream # read() mà không cần đóng socket?

Dưới đây là chiến lược xây dựng hiện hành đối với grabbing một dòng ổ cắm đầu vào và chuyển sang một DataInputStream interruptible:

InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream())); 
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream); 

Điều này làm cho việc sử dụng một ReadableByteChannel trong đó cung cấp một phương pháp read(ByteBuffer) với sự hỗ trợ cho một Throwable ClosedByInterruptException.

Sự cố xảy ra khi gọi ngắt trên quá trình tạo chuỗi read() cuộc gọi trên DataInputStream làm cho ổ cắm bên dưới bị đóng.

Đối với ngữ cảnh của tôi, tôi cần ổ cắm vẫn mở; cuộc gọi read đang đợi đầu vào của người dùng không đến, vì vậy tôi đang sử dụng ngắt để chuyển điều khiển trở lại thành phần cao hơn và sau đó cuối cùng quay lại read.

Tôi rất biết ơn nếu ai đó có thể đề xuất một cách để đạt được điều này bằng cách sử dụng JDK sẵn có các lớp học, hoặc có lẽ chỉ ra rằng nó không thể với một số thông tin.

Tôi hiểu rằng có nhiều cách khác để đạt được hiệu quả tương tự, nhưng vẫn tò mò muốn biết liệu phương pháp này có khả thi hay không.

+0

Bạn có thể sử dụng 'Selector' và' .select (int) 'trên socket. – fge

+1

đặt thời gian chờ đã đọc trên ổ cắm. – jtahlborn

+0

@fge - Cảm ơn bạn. Tôi đã điều tra những gì bạn đề xuất và có vẻ hợp lý. Vì vậy, nếu tôi chạy mySelector.select() trong thread của tôi thay vì đọc() trực tiếp, sau đó ngắt thread, socket sẽ vẫn mở? – KomodoDave

Trả lời

2

Nếu bạn ngắt InterruptibleChannel trong khi đọc, nó sẽ bị đóng và ném một ngoại lệ ClosedByInterruptception. Nếu bạn chỉ muốn một thời gian chờ đọc, không sử dụng một kênh ở tất cả, chỉ cần một Socket thường xuyên; gọi Socket.setSoTimeout() với thời gian chờ ngắn, và kiểm tra trạng thái isInterrupted() của luồng mỗi lần hết thời gian chờ. Vẫn còn tốt hơn, xem lại yêu cầu của bạn để làm gián đoạn chuỗi. Cái đó để làm gì?

+0

Rất cám ơn :-) – KomodoDave