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.
Bạn có thể sử dụng 'Selector' và' .select (int) 'trên socket. – fge
đặt thời gian chờ đã đọc trên ổ cắm. – jtahlborn
@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