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?