2011-10-01 15 views
6

Me siento realmente estúpido en este momento chicos ... básicamente me estoy conectando a través de TCP en una máquina local ... y cuando trato de hacer las transmisiones de entrada/salida en el cliente no se puede pasar creando la corriente de entrada de objeto. ¿Lo que da? Esto se detiene después de imprimir 2 ... sin excepciones ni nada ... Esta no es la primera vez que uso esta clase, que es en parte por lo que estoy desconcertado.Java ObjectInputStream colgando

try { 
      System.out.println("1"); 
      mySocket = new Socket("localhost", 11311); 
      System.out.println("12"); 
      oos = new ObjectOutputStream(mySocket.getOutputStream()); 
      System.out.println("2"); 
      ois = new ObjectInputStream(mySocket.getInputStream()); 
      System.out.println("13"); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
+0

¿El servidor está enviando el objeto? Parece que el servidor no envía nada. – MasterCassim

+0

'ObjectInputStream' probablemente espera que se reciba un encabezado de flujo. – NiematojakTomasz

+0

No estoy siguiendo ... el servidor acepta la conexión TCP. Pensé en leer que irías a ois.readObject()? Lo tengo configurado para que el cliente envíe el primer objeto ... Solo quería crear las secuencias. – Michael

Respuesta

6

Desde el specification de ObjectInputStream:

Este constructor se bloqueará hasta que la ObjectOutputStream correspondiente ha escrito y enrojecida la cabecera.

1

(Para futuros lectores :) Tuve el mismo problema porque hice un cambio tonto en el programa de servidor y no lo probé durante mucho tiempo, entonces estaba confundido acerca de por qué el programa está bloqueado.

ServerSocket acepta la conexión (responderSocket = serverSock.accept();) luego de repente por un if inadecuadoas (El cambio tonto he mencionado!) Programa salta de la rosca y porque yo no añadir un bloque finally para cerrar corrientes y enchufes del zócalo se dejó abandonado sin enviar o recibir nada (incluso encabezados de flujo). Así, en el programa del lado cliente no había cabecera de flujo (cuando yo debbugged El código vi que la última función ejecutada antes del bloqueo fue:

public ObjectInputStream(InputStream in) throws IOException { 
    verifySubclass(); 
    bin = new BlockDataInputStream(in); 
    handles = new HandleTable(10); 
    vlist = new ValidationList(); 
    enableOverride = false; 
    readStreamHeader();     //// <== This function 
    bin.setBlockDataMode(true); 
} 

readStreamHeader();)

así que tenga cuidado acerca de lo que sucede en el lado del servidor, tal vez el problema no sea donde lo esperas!

+3

En primer lugar, no debería haber construido los flujos de objetos en el bucle accept(). Debería construirlos en el método run() del hilo de manejo de conexión. De lo contrario, se corre el riesgo de bloquear el bucle accept() en la E/S para los encabezados de flujo, lo que bloqueará a más clientes. – EJP

Cuestiones relacionadas