recibir multiples examples enviar datos datagrama creación concepto con clientes java sockets

java - multiples - ¿El cierre de BufferedReader/PrintWriter cierra la conexión de socket?



sockets java examples (4)

Otra alternativa es crear usted mismo los filtros NoCloseInputStream y NoCloseOutputStream que simplemente no hacen nada al cerrar; luego utilícelos para envolver las transmisiones de su aplicación (antes de que cualquier aplicación se empape como un buffer).

Tenga en cuenta que si tuviera que hacer esto, necesitaría mantener una referencia al socket (o las secuencias envueltas) para que pueda cerrar el socket cuando haya terminado con él.

Responder al comentario de que este es un concepto "demasiado avanzado para el OP": el problema del OP es que al cerrar el flujo de nivel superior, también está cerrando el socket subyacente, pero eso no es bueno, ya que quiere crear más niveles superiores. fluye por el socket para enviar mensajes adicionales. Dependiendo de su arquitectura, la única forma de lograr esto puede ser envolver las transmisiones en envoltorios NoClose; por ejemplo, puede estar pasando las secuencias a un serializador XML o deserializador que cierra la transmisión cuando está lista, lo que queda fuera de su control .

Tengo una aplicación que usa conectores simples para pasar algunos caracteres entre dos sistemas. Tengo mi aplicación Java ejecutándose como servidor. Establezco una conexión correcta, e incluso paso un mensaje. Sin embargo, después de que se envió un mensaje, mi conexión se cierra.

Por lo que puedo decir, parece como si al cerrar el printWriter y el printWriter el socket. Esto es malo, ya que tengo varios mensajes para enviar en la misma conexión.

printWriter = new PrintWriter(theServer.getClientSocket().getOutputStream()); bufferedReader = new BufferedReader(new InputStreamReader(theServer.getClientSocket().getInputStream())); printWriter.println("the line"); printWriter.close(); //Closing on these lines? bufferedReader.close(); //Closing on these lines?

¿Estoy lleno de eso? ¿Cómo mantengo esta conexión en Java?


Debe cerrar el socket después de cerrar las transmisiones.


Sí, cerrar cualquier Escritor / Lector cerrará todos los demás Escritores y Lectores que envuelvan. No lo cierre hasta que esté listo para cerrar el zócalo subyacente.


Como dijo @Eddie (¡segundos antes que yo! :)), cerrar el escritor y / o el lector cerrará las secuencias de socket subyacentes y el socket en sí : Sin embargo, creo que el zócalo en sí no se cerrará .

Al cerrar el InputStream devuelto, se cerrará el socket asociado.

No debe cerrar el escritor ni el lector. Simplemente limpie el escritor para asegurarse de que sus mensajes lleguen a tiempo. Si cierra el socket más adelante, se cerrarán las transmisiones respectivas, por lo que no tendrá que cerrarlas usted mismo. Simplemente deje sus objetos de lector / escritor al GC.