Java Crear un nuevo ObjectInputStream Blocks

Intento crear un nuevo ObjectInputStream utilizando un InputStream recuperado de un Socket. Aquí está mi código:

Este es el constructor de mi clase MessageGetterSender. El progtwig no llega al Checkpoint 4.

public MessageGetterSender(Socket socket) { System.out.println("MessageGetterSender: Checkpoint 1"); this.socket = socket; // Get input and output streams try { System.out.println("MessageGetterSender: Checkpoint 2"); InputStream is = socket.getInputStream(); System.out.println("MessageGetterSender: Checkpoint 3"); this.in = new ObjectInputStream(is); System.out.println("MessageGetterSender: Checkpoint 4"); } catch (IOException ioe) { System.out.println("Could not get ObjectInputStream on socket: " + socket.getLocalPort()); } try { this.out = new ObjectOutputStream(socket.getOutputStream()); } catch (IOException ioe) { System.out.println("Could not get ObjectOutputStream on socket: " + socket.getLocalPort()); } System.out.println("MessageGetterSender: Checkpoint 5"); } 

Estoy instanciando un nuevo objeto MessageGetterSender de una clase en la que me conecto a un servidor para obtener el socket. Aquí está el código relevante. Es el constructor de InstantMessageClass, la clase que instancia el objeto MessageGetterSender:

 public InstantMessageClient(String username) { try { socket = new Socket("localhost", 5555); } catch (IOException ioe) { System.out.println("Error: Could not connect to socket on port: " + serverPort); } messageGetterSender = new MessageGetterSender(socket); ... 

Como el código no se ejecuta en el Punto de control 4, pero llega al Punto de control 3, estoy bastante seguro de que la instanciación del ObjectInputStream es el culpable. Sin embargo, no puedo entender por qué. ¿Algunas ideas? Gracias por la ayuda.

Cuando construyes un ObjectInputStream , en el constructor la clase intenta leer un encabezado que el ObjectOutputStream asociado en el otro extremo de la conexión ha escrito. No volverá hasta que ese encabezado haya sido leído. Entonces, si está viendo el constructor ‘colgar’, es porque el otro lado del socket no ha usado un ObjectOutputStream , o aún no ha ObjectOutputStream los datos.

Solo para ampliar la respuesta de FatGuy para otros Googlers que encuentran esto; La solución a este “problema del huevo y la gallina” es hacer que cada lado abra primero el flujo de salida, purgue el flujo de salida y luego abra el flujo de entrada.

 ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); out.flush(); ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); 

También puede retrasar la inicialización de ObjectInputStream hasta que los datos estén disponibles en la secuencia subyacente.

Este enfoque funciona independientemente del orden de inicialización del flujo, y es especialmente útil si un extremo del canal está en el código de la biblioteca que no puede cambiar.