Ver Mensaje Individual
  #4 (permalink)  
Antiguo 05/12/2014, 11:05
Avatar de chuidiang
chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Duda con cliente/servidor tcp en java

Hola:

El cliente no lo puedes modificar. Fíjate que usa DataOutputStream para escribir, con un \n al final y usa BufferedReader para leer, con un readLine(). Un readLine() se queda bloqueado hasta que encuentre una línea completa con un \n al final.

En tu primera versión de servidor usas InputStream y OuptutStream, pero no lees nada (el input lo cierras sin leer) y en el envío no envías un \n, que es lo que espera el cliente con el readLine().

En tu segunda versión, usas ObjectInputStream y ObjectOutputStream. Esas clases son muy específicas de java y sirven para enviar objetos java con un protocolo específico de java y requieren que al otro lado del socket haya esas mismas clases. Cuando envías un String con estas clases, no estás enviando un texto, sino una clase String de java con todos sus atributos y cosas. Olvida completamente esta versión.

O bien usas la primera versión, pero poniendo \n al final de cada línea que envíes, o bien usa los mismos objetos que usa el cliente (BufferedReader y DataOutputStream con \n al final). Para usar DataOuputStream con \n, casi es mejor usar PrintStream, que tiene método println() que ya añade el \n al final, pero puedes usar el que quieras.

Otro detalle para que tengas en cuenta. Si envías algo y cierras el socket inmediatamente después (es lo que estás haciendo), puede que no le des tiempo al otro lado a leerlo (depende de como implemente los sockets el sistema operativo). Para evitar esto, en el socket llama a la opción setsoLinger (ponle a on y un tiempo máximo para dar tiempo al otro lado a leer).

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 05/12/2014 a las 11:15