2010-10-18 13 views
22

En la API de Java,¿El cierre de la corriente de entrada de un zócalo también cierra la conexión del zócalo?

 

Socket socket = serverSocket.accept(); 
BufferedReader fromSocket = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
PrintWriter toSocket = new PrintWriter(socket.getOutputStream()); 
//do sth with fromSocket ... and close it 
fromSocket.close(); 
//then write to socket again 
toSocket.print("is socket connection still available?\r\n"); 
//close socket 
socket.close(); 
 

En el código anterior, después de cerrar el InputStream fromSocket, parece que la conexión de socket no está disponible - por el cliente suele recibir la "conexión de socket está todavía disponible" . ¿Eso significa que al cerrar la entrada de un socket también se cierra el socket?

+0

No, es imposible lanzar ninguna excepción en el lado del servidor. Parece que toSocket outputstream obj todavía funciona en el servidor, pero en el lado del cliente la conexión está cerrada. – dolaameng

Respuesta

35

Sí, al cerrar el flujo de entrada se cierra el zócalo. Es necesario utilizar el método shutdownInput el zócalo, a close just the input stream:

//do sth with fromSocket ... and close it 
socket.shutdownInput(); 

Entonces, todavía se puede enviar a la toma de salida

//then write to socket again 
toSocket.print("is socket connection still available?\r\n"); 
//close socket 
socket.close(); 
+3

No, realiza un apagado unidireccional, cerrando la mitad de entrada del zócalo (para que no pueda recibir más datos), pero aún así le permite enviar su mensaje en la mitad de salida, que pensé que era lo que estaba preguntando. Cuando finalmente llama a close() en el socket, el lado de salida también se cierra. –

+1

Sí, al cerrar la secuencia de entrada, se cierra el socket. Lo mismo ocurre con el flujo de salida. Así que, por supuesto, lo que debe cerrar es siempre el flujo de salida, por lo que se enrojece. – EJP

+0

No, no se puede volver a abrir. –

Cuestiones relacionadas