Creando 2 streams con un socket

Estoy tratando de crear un juego multijugador, que se ejecuta en Internet. El problema es que estoy tratando de obtener entrada en una transmisión y, por alguna razón, no puedo hacer 2 transmisiones con un solo socket, y explicaré:

Socket s=new Socket("127.0.0.1",5001); ObjectInputStream obj1=new ObjectInputStream(s.getInputStream()); ObjectInputStream obj2=new ObjectInputStream(s.getInputStream()); 

¿Puede alguien explicarme por qué este fragmento de código no funciona?

Edición: Aquí hay otro ejemplo para el ejemplo de código que no funciona.

 while (true) { try { objI = new ObjectInputStream(sock.getInputStream()); objO = new ObjectOutputStream(sock.getOutputStream()); }catch(Exception e) { e.printStackTrace(); } } 

Edit 2: muchas gracias por responder. Intenté limpiar los objetos, pero sigo recibiendo este error:

 java.io.StreamCorruptedException: invalid stream header: 33740003 at java.io.ObjectInputStream.readStreamHeader(Unknown Source) at java.io.ObjectInputStream.(Unknown Source) at Proccess.run(Proccess.java:22) at java.lang.Thread.run(Unknown Source) 

Las secuencias son de estado : cuando lees de una secuencia, estás leyendo desde alguna posición en la secuencia, y al hacerlo cambias la posición.

Si dos cosas (como las dos ObjectInputStreams de envoltorio) se leen de la secuencia subyacente al mismo tiempo, ambas intentarán cambiar la posición dentro de la secuencia, pero ninguna de ellas sabe lo que está haciendo la otra. Así que leer de uno cambia la posición, y luego el otro espera que el flujo esté donde lo dejó, pero no lo es.

Imagina que recibías esta respuesta como palabras escritas en diferentes hojas de papel, que te fueron entregadas una a una. Pero mientras estás leyendo los trozos de papel, alguien más se los está quitando antes de que los hayas visto; lo que obtuviste no tendría sentido. Eso es lo que está sucediendo: una secuencia quita partes de los datos, y cuando la otra stream vuelve a mirar los datos, falta parte de ella, y la otra stream la consume.

Tener un ObjectInputStream que lee los objetos entrantes. Si desea publicar esos objetos para varios consumidores, cree una colección de cosas para enviar los objetos entrantes, itérelos y pase el nuevo objeto a cada uno.

Socket es un tubo full duplex. Tiene un flujo de entrada y un flujo de salida. Para tener varias transmisiones, debe crear un protocolo de multiplexación en él (TCP).

Sin saber el mensaje de error, lo que debería suceder con su código es que siempre obtiene la misma secuencia de entrada / salida y debería bloquearse cuando intenta obtener ObjectInputStream . Esto se debe al hecho de que, por algún motivo, un ObjectInputStream creado ObjectInputStream necesita hablar con el ObjectOutputStream correspondiente y espera a que se conecte. Siempre uso el siguiente código:

 Socket socket = new Socket("localhost", 12345); ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); oos.flush(); ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 

Con la llamada para flush el flujo de entrada en el otro lado del zócalo está contento y continúa.

EDIT, con respecto a su Edit2: Parece que el segundo ObjectOutputStreams escribe algunos metadatos en el flujo que lee el primer InputStream (o viceversa). Los metadatos se interpretan como inconsistencias y se lanza la excepción. Realmente debería tener solo una secuencia de entrada y una de salida abiertas por socket y superponer cada una con un ObjectStream. Si necesitas más streams abre más sockets. Dependiendo de su sistema, puede tener unos 100 de ellos abiertos simultáneamente (si realmente necesita esto …)