java sockets tcp objectinputstream

Java ObjectInputStream colgante



sockets tcp (2)

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 pasa la creación de la corriente de entrada de objetos. ¿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.

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(); }


(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(); ) de repente para un programa inapropiado (el cambio tonto que mencioné) salta fuera del hilo y porque no agregué un bloque finally para cerrar las secuencias y los sockets socket se dejó abandonado sin enviar o recibir nada (incluso los encabezados de flujo). Por lo tanto, en el programa del lado del cliente no había un encabezado de transmisión (cuando depuré el código vi que la última función ejecutada antes del bloqueo era:

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 ten cuidado con lo que sucede en el lado del servidor, ¡tal vez el problema no esté donde lo esperas!


De la especificación de ObjectInputStream:

Este constructor bloqueará hasta que el ObjectOutputStream correspondiente haya escrito y vació el encabezado.