java sockets objectinputstream

java - nuevos bloques ObjectInputStream()



sockets (1)

ObjectOutputStream crear ObjectOutputStream antes de ObjectInputStream en ambos lados de la conexión (!). Cuando se crea ObjectInputStream , intenta leer el encabezado de flujo de objetos de InputStream . Por lo tanto, si el ObjectOutputStream del otro lado no se ha creado aún, no hay ningún encabezado de flujo de objetos para leer, y se bloqueará indefinidamente.

O redactado de forma diferente: si ambos lados primero construyen el ObjectInputStream , ambos bloquearán tratando de leer el encabezado del flujo de objetos, que no se escribirá hasta que se haya creado ObjectOutputStream (en el otro lado de la línea); lo cual nunca ocurrirá porque ambos lados están bloqueados en el constructor de ObjectInputStream .

Esto se puede inferir del Javadoc de ObjectInputStream(InputStream in) :

Un encabezado de secuencia de serialización se lee de la secuencia y se verifica. Este constructor bloqueará hasta que el ObjectOutputStream correspondiente haya escrito y vació el encabezado.

Esto también se describe en la sección 3.6.2 de Redes fundamentales en Java, de Esmond Pitt.

public class SerProg { static ServerSocket ser=null; static Socket cli=null; static ObjectInputStream ins=null; static ObjectOutputStream outs=null; public static void main(String[] args) { try { ser=new ServerSocket(9000,10); cli=ser.accept(); System.out.println("Connected to :"+cli.getInetAddress().getHostAddress()+" At Port :"+cli.getLocalPort()); ins=new ObjectInputStream(cli.getInputStream()); outs=new ObjectOutputStream(cli.getOutputStream()); String str=(String)ins.readObject(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

Y el cliente

public class SerProg { /** * @param args */ static ServerSocket ser=null; static Socket cli=null; static ObjectInputStream ins=null; static ObjectOutputStream outs=null; public static void main(String[] args) { // TODO Auto-generated method stub try { ser=new ServerSocket(9000,10); cli=ser.accept(); System.out.println("Connected to :"+cli.getInetAddress().getHostAddress()+" At Port :"+cli.getLocalPort()); ins=new ObjectInputStream(cli.getInputStream()); outs=new ObjectOutputStream(cli.getOutputStream()); String str=(String)ins.readObject(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

La conexión se establece con éxito, pero en la línea de código del servidor

ins=new ObjectInputStream(cli.getInputStream());

el código se detiene y no continúa, ¿cuál podría ser el problema?