Sobre Object[Input/Output]Stream

kraneok

Buenas que tal. Hoy vengo con un problema que me está volviendo loco, quizás esté saturado totalmente, o no sé que mierdas me ocurre.
Resulta que llevo trabajando con Socket unos tres meses o así, siempre he utilizado las clases de escritura y lectura que he puesto en el título, siempre me han funcionado perfectamente, he realizado chats, juegos, etc por socket con esas clases y nunca, nunca y nunca he obtenido problema alguno.

Pero resulta que llevo dos días que no consigo echar a andar un proyecto nuevo utilizando dichas clases, no sé que ocurre, estoy totalmente desconcertado.
Es curioso por que incluso copiando código de mis anteriores proyectos donde los utilizo que SI funcionan al ejecutar este nuevo proyecto no FUNCIONA!!! increible, estoy flipando de verdad, ¿ como es posible ?, he creado mil proyectos mas de prueba realizando la simple actividad de conectar un ServerSocket con un Socket y enviar una puta cadena de texto, nada, no hace nada de nada de nada.

El problema está que no pasa de los métodos que me sacan los canales de escritura/lectura, vamos, que todos los putos proyectos se me quedan aquí

 conContraria = new Socket( "127.0.0.1", puertoContrario );;
            if( conContraria.isConnected() )
            {
                //Recibimos canales
                ObjectInputStream ois = new ObjectInputStream( conContraria.getInputStream() );
                ObjectOutputStream oos = new ObjectOutputStream( conContraria.getOutputStream() );

            PartidaActiva partida = new PartidaActiva( conContraria );
            partida.start();


        }

¿ Que demonios está pasando ?, ¿ por qué está ocurriendo esto ?, tengo proyectos que si funcionan perfectamente haciendo lo mismo....
Pues no, desde hace dos días el hacer eso, se queda bloqueado y no obtiene los canales, no sé, no tengo ni idea ya de que puedo hacer, he leído mil cosas sobre flujos he probado mil formas de leer y escribir, incluso bytes en crudo....en fin, estoy agotado realmente.

Si alguien puede echarme una mano se lo agradecería con todo el corazón, pues estoy bastante preocupado, enserio, me preocupa ver como no soy capaz de realizar una conexión sencilla y mas cuando llevo haciéndolo tres putos meses sin parar....

Gracias y saludos..

bLero

#1 Por el momento ahí te veo 2 puntos y coma al final de la primera línea, aunque supongo que te habrás confundido al escribir el código aquí.

Con ese código es imposible detectar el fallo, ¿puedes poner el serversocket?

1 respuesta
kraneok

#2 Bueno los dos ;; ya los vía y los quité pero nada.
El resto del código no puedo pegarlo ya, por que he vuelto a reescribir todo, pero nada, sigo igual.
El serversocket sería

ServerSocket socket = new ServerSocket( puerto, backlog, InetAddress.getByName( IP ) );

Así es como siempre uso yo el serversocket..creo que es correcto.
xDD

1 respuesta
bLero

#3

Prueba:

ServerSocket ss = new ServerSocket(puerto);
Socket client = ss.accept();

y en el cliente:

Socket s = new Socket("localhost", puerto);

Luego coges los flujos. Esto debe funcionar, si no lo hace es que hay problemas con algún firewall.

Lo que te debe estar dando problemas es

InetAddress.getByName(IP);

¿Cuál es el valor de IP? Estás bindeando el servidor a esa ip y luego conectándote a localhost...

1 respuesta
kraneok

#4 No a ver, conectar conecta, pero al obtener los flujos se queda pillado, esto no creo que tenga que ver con puertos no?, o si?. Además con el tema puertos nunca he tenido problemas, es raro.
#4 Con ip me refiero a "127.0.0.1", donde el servidor escucha en esa ip y en el puerto por ejemplo 9999 y el cliente se conecta a "127.0.0.1", puerto 9999

1 respuesta
bLero

#5 vale, pensé que ni siquiera te conectaba.

prueba:

ObjectOutputStream oos = new ObjectOutputStream(conContraria.getOutputStream());
oos.flush();
ObjectInputStream ois = new ObjectInputStream(conContraria.getInputStream());

Según la documentación de java:

"ObjectInputStream(): Creates an ObjectInputStream that reads from the specified InputStream. A serialization stream header is read from the stream and verified. This constructor will block until the corresponding ObjectOutputStream has written and flushed the header."

1 2 respuestas
kraneok

#6 Voy a probar eso a ver que tal

kraneok

#6 DIN! lo clavaste.! me diste la solución indirectamente.
¿ El problema ?, crear el canal de entrada antes de el de salida, no puede, se queda pillado, es decir, primero se debe crear el canal de salida( Input ) y después el de entrada ( Output ).
He probado a hacerlo también sin el flush y funciona.

Es increíble, por que entonces esto quiere decir que en todos los meses que llevo practicando socket nunca había puesto un input antes de un output, y todo sin saberlo...me parece realmente tonto.

A ti, #6, muchísimas gracias me ha ayudado mucho, pues tengo que entregar esto pronto y no sabía ya por donde iba a ir, la próxima vez miraré mas por el javadoc...aunque bueno, son cosas tan tontas e inesperadas...que es eso no te lo esperas esa tontería.

Muchísimas gracias de nuevo.

2

Usuarios habituales

  • kraneok
  • bLero