Java - Socket servidor no envía datos

 
Vista:

Socket servidor no envía datos

Publicado por antonio (5 intervenciones) el 02/04/2007 13:39:21
Buenas a todos,

En respuesta a Gonzalo que me comentó que subiera el código para que vieseís lo que hacía aquí lo teneís.

//En el servlet llamo a un thread en el método init, que va a crear un ServerSocket
public void init (ServletConfig config) throws ServletException
{
super.init (config);
thread_control = new SimpleThread ();
thread_control.start ();
}

// El método run del thread en el que llamo al ServerSocket
public void run () {
ServerSocket sock = ServidorSocket.CrearSocketServidor ();
while (true) {
System.out.println ("Creamos el socket Servidor");
socket = ServidorSocket.ServirSocketServidor (sock);
}
}

// Este es el código del ServerSocket
Socket Servidor

public static ServerSocket CrearSocketServidor() {
ServerSocket socket = null;
try
{
// Se crea un socket servidor atendiendo a un determinado puerto.
// Por ejemplo, el 35557.
// METEMOS EL PUERTO QUE NOS ASIGNEN
socket = new ServerSocket (35551);
} catch (Exception e){
e.printStackTrace();
}

System.out.println ("Esperando cliente");
return socket;
}

public static ServerSocket ServirSocketServidor(ServerSocket socket)
{
String pathxml = Conexiones.getPathXML ();
String pathlistados = Conexiones.getPathListados ();

try {
System.out.println("Entro para aceptar clientes");
Socket cliente = socket.accept();
System.out.println ("Conectado con cliente de " + cliente.getInetAddress());

// Se hace que el cierre del socket sea "gracioso". Esta llamada sólo
// es necesaria si cerramos el socket inmediatamente después de
// enviar los datos (como en este caso).
// setSoLinger() a true hace que el cierre del socket espere a que
// el cliente lea los datos, hasta un máximo de 10 segundos de espera.
// Si no ponemos esto, el socket se cierra inmediatamente y si el
// cliente no ha tenido tiempo de leerlos, los datos se pierden.
cliente.setSoLinger (true, 10);

ObjectInputStream entrada = new ObjectInputStream(cliente.getInputStream());
ObjectOutputStream buffer_salida = new ObjectOutputStream(cliente.getOutputStream());
String tipo = entrada.readUTF ();
System.out.println("tipo "+tipo);
if (tipo.equals ("login")) {
String usuario = entrada.readUTF ();
String password = entrada.readUTF ();
System.out.println("SERVIDOR SOCKET El usuario "+usuario+" y el password "+password);
// REALIZO LAS OPERACIONES NECESARIAS
buffer_salida.writeInt (10);
}
}
}
entrada.close ();
buffer_salida.close ();
System.out.println("Acabado todo con EXITO");

} catch (IOException ioe) {
System.out.println ("IOException: "+ioe);
} catch (ClassNotFoundException cnfe) {
System.out.println ("ClassNotFoundException: "+cnfe);
}
return socket;
}


//Cliente Socket, llamado para pasar el nombre y el password
public ClienteSocket(String nom, String pass) throws UnknownHostException, IOException {
try
{
System.out.println("Entro en ClienteSocket con nombre y password");
this.s = new Socket ("localhost", 35551);
this.usuario = nom;
this.password = pass;
this.ServirCliente (this.s,nom,pass);
} catch (UnknownHostException ex){
System.out.println ("Error UnknownHostException "+ex.getMessage ());
ex.printStackTrace();
} catch (IOException ex){
System.out.println ("Error IOException "+ex.getMessage ());
ex.printStackTrace();
}
}

/**
* Crea el socket cliente y lee los datos
*/
public static void ServirCliente(Socket soc, String nom, String pass)
//public static void ServirCliente(Socket soc, String nom)
{
try
{
String path = Conexiones.getPathXML ();
OutputStream os = soc.getOutputStream();
ObjectOutputStream salida = new ObjectOutputStream(os);
InputStream is = soc.getInputStream ();
ObjectInputStream entrada = new ObjectInputStream(is);

System.out.println ("el pass es "+pass);
if (pass == null) {
// Escribimos primero que enviamos el fichero para que el servidor reconozca el servicio
salida.writeUTF ("fichero");
System.out.println("nombre "+nom);
System.out.println("path "+path);
String fich = path+nom;
System.out.println ("Escribimos el fichero "+fich);
File fichero = new File(fich);
salida.writeObject (fichero);
} else {
salida.writeUTF ("login");
salida.writeUTF (nom);
salida.writeUTF (pass);
System.out.println("Leemos la entrada");
//String ent = entrada.readUTF ();
System.out.println("entrada obtenida "+entrada.readInt ());
}

System.out.println ("CORRECTO");

salida.close ();
entrada.close ();
//soc.close ();

}
catch (Exception e)
{
System.out.println("Excepcion "+e);
e.printStackTrace();
}
}

Pues bien como ya dije días atrás cuando ejecuto el cliente, efectivamente se conecta con el servidor, pero luego se queda sin hacer nada la apliación, se queda colgada, y como ya dije si desde el server socket no le paso ningún parametro al cliente funciona perfectamente, falla cuando en el ServerSocket pongo el writeInt.

¿Alguna idea?

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Socket servidor no envía datos

Publicado por Gonzalo (180 intervenciones) el 02/04/2007 15:09:11
Ese código no compila. Bueno, evidentemente no compila porque sólo has puesto trozos, pero es que además, en ServirSocketServidor no has puesto el método completo. O te has dejado unas llaves ahí en medio.


Pero en fin, intentemos algo a ver...

La línea System.out.println("SERVIDOR SOCKET El usuario "+usuario+" y el password "+password); se imprime? La siguiente: System.out.println("Acabado todo con EXITO"); se imprime?

Y esta línea del cliente: System.out.println("Leemos la entrada"); se imprime?

Cuál de los dos se queda colgado el servidor? el cliente? los dos?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Socket servidor no envía datos

Publicado por Antonio (5 intervenciones) el 02/04/2007 15:25:23
Buenas gonzalo,

Te comento el primer System.out.println que me indicas no se imprime, al igual que tampoco se imprime el segundo.

La línea de Leemos la entrada si se imprime.

Se queda colgado las dos porque el cliente se queda esperando a la entrada y el servidor no envía nada. Se queda colgado en el cliente en "Leemos la entrada" y en el SocketServidor se queda colgado en "Conectado con cliente de /127.0.0.1"

Y ya no hace nada más.

Gracias y un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Socket servidor no envía datos

Publicado por antonio (5 intervenciones) el 02/04/2007 15:32:19
Por cierto aquí va completo el código para ver si te aclara algo.

\\En el servlet del servidor
public void init (ServletConfig config) throws ServletException
{
super.init (config);
thread_control = new SimpleThread ();
thread_control.start ();
}

\\El código del thread
public Thread SimpleThread ()
{
Thread thread_control = new Thread();
return thread_control;
}

public void run () {
ServerSocket sock = ServidorSocket.CrearSocketServidor ();
while (true) {
System.out.println ("Creamos el socket Servidor");
socket = ServidorSocket.ServirSocketServidor (sock);
}
}

\\El código del ServerSocket
public class ServidorSocket
{
public ServidorSocket() {}

public static ServerSocket CrearSocketServidor() {
ServerSocket socket = null;
try
{
socket = new ServerSocket (35551);
} catch (Exception e){
e.printStackTrace();
}

System.out.println ("Esperando cliente");
return socket;
}

public static ServerSocket ServirSocketServidor(ServerSocket socket)
{
String pathxml = Conexiones.getPathXML ();
String pathlistados = Conexiones.getPathListados ();

try {
System.out.println("Entro para aceptar clientes");
Socket cliente = socket.accept();
System.out.println ("Conectado con cliente de " + cliente.getInetAddress());

cliente.setSoLinger (true, 10);

ObjectInputStream entrada = new ObjectInputStream(cliente.getInputStream());
ObjectOutputStream buffer_salida = new ObjectOutputStream(cliente.getOutputStream());
String tipo = entrada.readUTF ();
System.out.println("tipo "+tipo);

if (tipo.equals ("fichero")) {
System.out.println ("\n EL PATH XML OBTENIDO ES "+pathxml+"\n\n");
File fichero = (File) entrada.readObject ();
String nombre = fichero.getName ();
System.out.println ("nombre obtenido "+nombre);
System.out.println ("renombramos el fichero en "+pathxml+nombre);
fichero.renameTo (new File(pathxml+nombre));
} else {
if (tipo.equals ("listados")) {
System.out.println ("\n EL PATH LISTADOS OBTENIDO ES "+pathlistados+"\n\n");
String subdir = entrada.readUTF ();
String dir = pathlistados+subdir;
File directorio = new File(dir);
if (!directorio.exists ()) {
directorio.mkdir();
System.out.println ("Directorio creado con exito");
} else {
System.out.println ("El Directorio ya existe");
}

File fichero = (File) entrada.readObject ();
String nombre = fichero.getName ();
System.out.println ("nombre obtenido "+nombre);
System.out.println ("grabamos en "+dir+"\\"+nombre);

byte[] buffer = new byte[Integer.parseInt (String.valueOf (fichero.length ()))];
FileInputStream fin = new FileInputStream (fichero);
int bytesLeidos = fin.read (buffer);
fin.close ();
System.out.println ("LEIDO");

File fichero2 = new File (dir+"\\"+nombre);
FileOutputStream fout = new FileOutputStream (fichero2);
fout.write (buffer);
fout.close ();
System.out.println ("ESCRITO");
} else {
if (tipo.equals ("login")) {
String usuario = entrada.readUTF ();
String password = entrada.readUTF ();
System.out.println("SERVIDOR SOCKET El usuario "+usuario+" y el password "+password);
buffer_salida.writeInt (10);
}
}
}
entrada.close ();
buffer_salida.close ();
System.out.println("Acabado todo con EXITO");
} catch (IOException ioe) {
System.out.println ("IOException: "+ioe);
} catch (ClassNotFoundException cnfe) {
System.out.println ("ClassNotFoundException: "+cnfe);
}
return socket;
}
}

\\ LA LLAMADA EN LA MAQUINA CLIENTE DENTRO DE SU SERVLET
String usu = request.getParameter ("nombre_usu").toString ();
String pass = request.getParameter ("pass_usu").toString ();
logger.debug ("El usuario "+usu+" y password "+pass);
ClienteSocket cliente_sock = new ClienteSocket (usu,pass);

\\El código del cliente
public class ClienteSocket
{
Socket s;
String nombre;
String usuario;
String password;

public ClienteSocket(String nom, String pass) throws UnknownHostException, IOException {
try
{
System.out.println("Entro en ClienteSocket con nombre y password");
this.s = new Socket ("localhost", 35551);
this.usuario = nom;
this.password = pass;
this.ServirCliente (this.s,nom,pass);
} catch (UnknownHostException ex){
System.out.println ("Error UnknownHostException "+ex.getMessage ());
ex.printStackTrace();
} catch (IOException ex){
System.out.println ("Error IOException "+ex.getMessage ());
ex.printStackTrace();
}
}

public static void ServirCliente(Socket soc, String nom, String pass)
{
try
{
String path = Conexiones.getPathXML ();
OutputStream os = soc.getOutputStream();
ObjectOutputStream salida = new ObjectOutputStream(os);
InputStream is = soc.getInputStream ();
ObjectInputStream entrada = new ObjectInputStream(is);

System.out.println ("el pass es "+pass);
if (pass == null) {
salida.writeUTF ("fichero");
System.out.println("nombre "+nom);
System.out.println("path "+path);
String fich = path+nom;
System.out.println ("Escribimos el fichero "+fich);
File fichero = new File(fich);
salida.writeObject (fichero);
} else {
salida.writeUTF ("login");
salida.writeUTF (nom);
salida.writeUTF (pass);
System.out.println("Leemos la entrada");
//String ent = entrada.readUTF ();
System.out.println("entrada obtenida "+entrada.readInt ());
}

System.out.println ("CORRECTO");

salida.close ();
entrada.close ();
}
catch (Exception e)
{
System.out.println("Excepcion "+e);
e.printStackTrace();
}
}
}

Espero que ayude en algo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Socket servidor no envía datos

Publicado por Gonzalo (180 intervenciones) el 02/04/2007 15:55:23
Entonces... en el servidor:

Imprime:
System.out.println ("Conectado con cliente de " + cliente.getInetAddress());
pero no imprime:
System.out.println("tipo "+tipo);
¿Correcto?

Y en el cliente sale:
System.out.println("Leemos la entrada");
pero no sale:
System.out.println("entrada obtenida "+entrada.readInt ());
¿Correcto?

No veo muy bien qué relación tiene con que hagas un writeInt en el servidor si por lo que me estás diciendo el servidor se queda parado mucho antes.

¿Has probado a insertar un flush() aquí?:

salida.writeUTF ("login");
salida.writeUTF (nom);
salida.writeUTF (pass);
salida.flush() // Esta línea.
System.out.println("Leemos la entrada");
System.out.println("entrada obtenida "+entrada.readInt ());
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Socket servidor no envía datos

Publicado por antonio (5 intervenciones) el 02/04/2007 16:20:55
Gracias gonzalo,

Ya funciona perfectamente y savlo una excepción que había que también está solucionada funciona perfectamente.

Fijate que llevo un para de días luchando con esto y yo pensaba que era más bien algo que tenía que ver con que perdía el ServerSocket y perdía entonces la comunicación, pero nunca imagine que era por no vaciar el buffer de salida.

Muchas gracias me has ayudado muchísimo.

Un saludo y estoy a tu disposición.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Socket servidor no envía datos

Publicado por Gonzalo (180 intervenciones) el 02/04/2007 16:25:33
En general, los Streams que van sobre red suelen llevar asociado siempre un buffer. Así que es conveniente después de haber escrito algo, hacer un flush. Lo que no me cuadraba era eso de que por hacer un writeInt dejaba de funcionar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar