example java android iostream eof

java - example - inputstreamreader



Fundamentos de las llamadas iostream y read/writeObject (4)

Estoy diseñando un servidor java para responder a múltiples solicitudes de clientes. Entonces, el diseño básicamente tiene un socket de servidor, acepta un socket de cliente, crea un inputObjectStream y un outputObjectStream desde el input / outputStream del cliente.

Luego utilizo writeobject en el cliente para realizar una solicitud, readObject en el servidor para recibir la solicitud. Procéselo, vuelva a escribir el objeto en la misma secuencia como respuesta y en el objeto de lectura del lado del cliente para procesar la respuesta.

Ahora, si ejecuto el código en un emulador / dispositivo de Android funciona bien. El mismo código si lo ejecuto en un "caso de prueba java de junit java", obtengo una excepción después de que procesa todas mis solicitudes. La excepción está en el lado del servidor en la llamada a readObject.

java.io.EOFException at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2570) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1314) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)`

Pregunta ¿Es un diseño correcto para leer / escribir objetos en un iostream?

Editado

Tengo el proyecto de muestra cargado en 4shared.com (http://www.4shared.com/archive/98gET_pV/Issue15426tar.html) O (http://www.sendspace.com/file/v04zjp)

Prueba 1 (PASS)

  1. Proyecto TestServer, ejecútelo como una aplicación Java.
  2. Proyecto TestClient, ejecutarlo como una aplicación de Android

Salida de consola

Socket del servidor abierto /127.0.0.1

Toma de cliente aceptada

Flujo de entrada creado

Flujo de salida creado

Leer el objeto creado

Prueba 2 (FAIL)

  1. Proyecto TestServer, ejecútelo como una aplicación Java.
  2. Proyecto TestClient, ejecútelo como una prueba de Android Junit

Salida de consola

Socket del servidor abierto /127.0.0.1

Toma de cliente aceptada

Error : Unable to open server socket. Server wont load. java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2297) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2766) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:797) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:297) at com.test.server.myThread.run(Main.java:52) at com.test.server.Main.main(Main.java:32)


Creo que esto es porque, su cliente sale después de ejecutar

objectOutputStream.writeObject(message) ;

Así que intenta introducir un retraso artificial después de esta línea y verás.

En todos los casos, cuando el cliente / servidor cierra las conexiones / termina el programa, el otro extremo lanzará esta excepción EOF si está esperando alguna entrada (por ejemplo, inputObjectStream.readObject ())

así que asegúrese de que el servidor lea correctamente lo que está escrito por el cliente antes de que finalice el cliente. Así que introduce algún retraso en el cliente y verás.


Debe elegir un puerto de servidor por encima de 1024, ya que todos los puertos a continuación están reservados para servicios conocidos. Simplemente elija un puerto entre 1024 y 65535 y vea si funciona entonces.

También le recomendaría que envuelva su ObjectInputStream en un BufferedInputStream; Puede ser que una vez que tu conexión no sea tan estable, fracasará.


No estoy seguro de si esto causa este problema específico, pero siempre debe usar este orden al crear secuencias de objetos:

  1. Crear ObjectOutputStream
  2. Tirar de la cadena
  3. Crear ObjectInputStream

Veo que al menos en el lado del servidor, usted creó primero ObjectInputStream y no ObjectInputStream el flujo, lo que podría causarle problemas.

Here hay más información sobre el tema y las razones detrás de este pedido.


Por favor, descargue el flujo en el lado del cliente. Espero que eso solucione el problema.