¿Conoces una forma de interrumpir una lectura de Java InputStream
sin cerrar el socket asociado?¿Alguna forma de usar java.nio. * Para interrumpir un InputStream # read() sin cerrar el socket?
Aquí es la estrategia de construcción actual de agarrar un flujo de entrada zócalo y la conversión a un DataInputStream interrumpible:
InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream()));
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream);
Esto hace uso de un ReadableByteChannel
que ofrece un método read(ByteBuffer)
con soporte para una throwable ClosedByInterruptException
.
El problema es que llamar a una interrupción en el hilo haciendo llamadas a read()
en el DataInputStream
hace que se cierre el zócalo subyacente.
Para mi contexto, necesito que el socket permanezca abierto; la llamada read
está esperando la entrada del usuario que no viene, entonces estoy usando la interrupción para pasar el control a un componente más alto y finalmente regresar al read
nuevamente.
Estaría muy agradecido si alguien pudiera sugerir una forma de lograrlo utilizando las clases integradas de JDK, o tal vez señalando que no es posible con algo de información.
Entiendo que hay otras formas de lograr el mismo efecto, pero de todos modos tengo curiosidad por saber si este enfoque es factible.
Puede usar un 'Selector' y' .select (int) 'en el socket. – fge
establece un tiempo de espera de lectura en el socket. – jtahlborn
@fge - Gracias. Investigué lo que sugirió y parece plausible. Entonces, si ejecuto mySelector.select() en mi hilo en lugar de read() directamente, y luego interrumpo el hilo, el socket permanecerá abierto. – KomodoDave