Flujos y Sockets

Hola gente buen día:

Estoy tratando de dominar el tema de los sockets en java, para lograr esto, estoy haciendo un chat en línea de comando, nada gráfico. Estoy experimentando un problema bastante raro o quizá no tanto, espero me explique bien y me puedan ayudar.

Ya hice la parte de la conexión, envio de mensajes y todo esta bien. El problema se presenta a la hora finalizar el chat.

1.- El Servidor solo acepta dos clientes.
2.- En el lado del cliente, una vez conectado al servidor, obtengo del mismo socket los flujos de entrada (getInputStream) y salida (getOutputStream), a continuación el código.

socket = new Socket(Constantes.SERVIDOR, Constantes.PUERTO);
salidaAlServidor = new PrintWriter(socket.getOutputStream(), true);
entradaDelServidor = new BufferedReader(new InputStreamReader(socket.getInputStream()));

3.- Una vez obtenidos los flujos, levanto dos hilos, uno donde uso el flujo de entrada, como listener para recibir mensajes. El otro hilo usa el flujo de salida, también como listener para enviar mensajes, así puedo recibir y enviar mensajes en cualquier momento.
4.- Cuando uno de los clientes escribe la palabra 'quit' para terminar el chat, cierro única y exclusivamente el flujo de salida, pero al hacer esto al parecer también se cierra el flujo de entrada, que en ese momento estaba esperando a recibir un mensaje y me manda la excepción "Socket closed"

Mi teoría es: Como el socket está conectado a un canal, supongo que los flujos usa el mismo para entrada y salida. Entonces si cierro alguno de los dos flujos, se cierran ambos.

La pregunta es: Mi teoría es correcta¿?¿?¿?¿?¿?....

Saludos y gracias.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

java.nio

Mencionas que el socket está conectado a un canal, eso me suena a SocketChannel o sea java.nio, pero tu ejemplo usa un Socket normal, y además usas hilos, lo cual es de java.io...

Ya no muestras el código donde cierras el flujo de salida. Supongo que es  , que se supone debe cerrar solamente el stream de salida. En vez de eso, intenta con  , ese método deshabilita la escritura al socket y envía todos los datos pendientes de enviar. Pero no hagas close() al OutputStream.

Imagen de elbrujox

Hola ezamudio, gracias por

Hola ezamudio, gracias por contestar.

Por canal me refería a la conexión establecida con el servidor, como conducto de comunicación, nada que ver con SocketChannel, disculpa la confusión.

Efectivamente, el OutputStream lo cierro con el método close(), pero cuando hago eso, al parecer también cierra el flujo de InputStream, ya que según yo, como están referenciados al mismo socket, cerrar uno, cierra todo flujo a través del socket y por eso me manda la excepción, pero intentaré el método que mencionas y estaré posteando los resultados.

Gracias por tu aporte =)

S

c