Java - Java y Sockets

   
Vista:

Java y Sockets

Publicado por gonzalo (84 intervenciones) el 18/07/2016 02:42:10
Buenas tardes

aqui pidiendo su ayuda de nuevo.

tengo un procedimiento que debe conectarse via Socket a un servidor, la primer vez que se conecta y pasa informacon no hay problema, el problema es la segunda vez que debo conectarme

del lado del servidor dice "NullPointerException"

y del lado del cliente dice "reconect"

es como que al perder la conexcion la rutina tratara de reconectarse en forma automatica.

hay manera ce cancelar la autoreconexion?

salu2
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

Java y Sockets

Hola que tal mira yo tengo este código y jamas me ha pasado eso que tu dices posiblemente en algún lado estés haciendo una validación de tiempo para desconectar

Código del Servidor:


import java.net.*; //Importa la libreria java.net
import java.io.*; //Importa la libreria java.io

public class servidortcp {
//se declara una clase de nombre servidortcp

public static void main(String argv[]) {
//Se declara el método principal main que espera un parámetro

System.out.println("SERVIDOR");
ServerSocket socket; //Se crea un objeto de ServerSocket
//boolean fin = false; //Se declara una variable booleana inicializada a false


try {
//Abrimos una exceptción para el tratamiento de errores
//Creamos un servidor
socket = new ServerSocket(6004); //Abre un socket en modo escucha en el puerto 6001
Socket socket_cli = socket.accept(); //Inicio.Se acepta la conexión.

//Método de la clase socket para recibir datos
DataInputStream in =
new DataInputStream(socket_cli.getInputStream());

//Método para mandar un valor al cliente
DataOutputStream out =
new DataOutputStream(socket_cli.getOutputStream());


String mensaje =""; //Se inicializa la variable de string mensaje a vacío
mensaje = in.readUTF(); //La variable Mensaje guarda el valor que ha mandado el cliente

if (mensaje.startsWith("HELLO")) {
out.writeUTF("HELLO");
}

do {

//Estará escuchando el mensaje sin interrupción debido a la condición (1>0) del while
mensaje =""; //Se inicializa la variable de string mensaje a vacío
mensaje = in.readUTF(); //La variable Mensaje guarda el valor que ha mandado el cliente

if (mensaje.startsWith("ALL")) {

mensaje = "ALL BUR:250;CHE:300; BIG:540; PAT:380; SAL:240; BEV:210; DIE:0; COF:0; DES:300";
System.out.println(mensaje);

}
else if(mensaje.startsWith("BUR"))
{
mensaje = "BUR 250";
System.out.println(mensaje);
}
else if (mensaje.startsWith("CHE")) {
mensaje = "CHE 300";
System.out.println(mensaje);
}
else if (mensaje.startsWith("BIG")) {
mensaje= "BIG 540";
System.out.println(mensaje);
}
else if (mensaje.startsWith("PAT")) {
mensaje= "PAT 380";
System.out.println(mensaje);
}
else if (mensaje.startsWith("SAL")) {
mensaje= "SAL 240";
System.out.println(mensaje);
}
else if (mensaje.startsWith("BEV")) {
mensaje= "SAL 210";
System.out.println(mensaje);
}
else if (mensaje.startsWith("DIE")) {
mensaje= "DIE 0";
System.out.println(mensaje);
}
else if (mensaje.startsWith("COF")) {
mensaje= "COF 0";
System.out.println(mensaje);
}
else if (mensaje.startsWith("DES")) {
mensaje= "DES 300";
System.out.println(mensaje);
}
else if (mensaje.startsWith("fin")) {
mensaje= "fin";
System.out.println(mensaje);
}
else{
mensaje = "ERROR";
System.out.println(mensaje);
}

//Mandamos al cliente la respuesta de las calorias según lo que ha mandado
out.writeUTF(mensaje);
//System.out.println(mensaje);

} while (1>0);
}
catch (Exception e) {
//Si se produce algún error saltará la excepción con el mensaje de error
System.err.println(e.getMessage());
System.exit(1); //Salimos con error
}
}
}


Código del Cliente:


import java.net.*; //Se importa la libreria java.net
import java.io.*; //Se importa la libreria java.io

//Se declara la clase clientetcp
public class clientetcp {

//Se declara el método principal main que recibe un parámetro
public static void main(String argv[]) {

//Si no recibe ningún parámetro dará error
if (argv.length == 0) {
System.err.println("java clientetcp servidor");
System.exit(1);
}
System.out.println("CLIENTE");

// Se guarda en el buffer un valor introducido por pantalla
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

Socket socket=null; //Se crea un objeto de tipo socket
InetAddress address; //Se crea un objeto de tipo InetAddress
String mensaje=""; //Se declara una variable de tipo string

try {
//Se abre una excepción
//Obtiene el nombre de la dirección remota del socket
address=InetAddress.getByName(argv[0]);

try{
socket = new Socket(address,Integer.parseInt(argv[1])); //Se crea un objeto de tipo socket
//para establecer una conexión por el puerto 6001
}catch(NumberFormatException nfe){
System.err.println("El argumento argv[1] no es un numero");
System.exit(1);
}

//Se declara un objeto de tipo DataOutputStream para mandar valores al servidor
DataOutputStream out =
new DataOutputStream(socket.getOutputStream());

//Se declara un objeto de tipo DataOutputStream para mandar obtener al servidor
DataInputStream in2 =
new DataInputStream(socket.getInputStream());

//Mandamos la palabra HELLO al servidor
out.writeUTF("HELLO");
//Recogemos lo que nos devuelve el servidor y lo guardamos en la variable mensaje
mensaje = in2.readUTF();
System.out.println(mensaje); //Imprime el contenido de mensaje

do {
//Mientras el mensaje no sea fin seguira leyendo
mensaje = in.readLine();
out.writeUTF(mensaje);
//System.out.println(mensaje); //Imprime el contenido de mensaje
//NUEVO
mensaje =""; //Se inicializa la variable de string mensaje a vacío
mensaje = in2.readUTF();
System.out.println(mensaje); //Imprime el contenido de mensaje
//NUEVO
} while (!mensaje.startsWith("fin"));
}
catch (Exception e) {
System.err.println(e.getMessage());
System.exit(1);
}
}
}
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

Java y Sockets

Publicado por gonzalo (84 intervenciones) el 18/07/2016 18:06:44
Hola alejandro, gracias por compartirlo, lo voy a revisar y te mando mis comentarios.

aqui entonces lo que haces es abrir una sola sesion, al terminar la comunicacion cierras los programas, hasta ahi no veo problema, en mi caso debo cerrar la conexion del lado del servidor y dejar listo el puerto para aceptar otra conexion, ahi es donde me marca el error de reconexion.

esto es, la primer vez que se conecta no hay problema, el problema es cuando trata de reconectarse, el programa se cicla, no hay transferencia de datos y el puerto marca "pausa" "activo" "pausa" "activo" y en el log dice NullPointerAssigment del lado del server y "try to reconnect" del lado del cliente.

y acabo de encontrar otro mensaje que dice "la conexcion esta en uso", lo cual es raro porque ya verifique el procedimiento y si pasa por la orden Close.

en parte lo que he visto es que al parecer no paso toda la informacion lo cual es raro ya que todo el procedimiento esta basado en el paso de la informacion, el problema esta al cerrar el puerto, aparentemente lo cierra pero parece ser que lo deja activo.

en mi logica digo que si funciona la primera vez .. deberia funcionar en la siguiente, pero tengo algun error y se cicla.

salu2
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

Java y Sockets

Publicado por gonzalo (84 intervenciones) el 18/07/2016 20:17:51
Hola alejandro.

creo que estoy en el camino de encontrar la sollucion al problema.

bueno, priero te tengo que comentar que la clase que controla las comunicaciones esta dentro de un hilo.

asi que al cerrar la comunicacion deberia cerrar tambien el hilo y crear uno nuevo, pero segun veo no mande la orden de cerrar el hilo, termina la secuencia del run pero no hay ninguna instruccion que mande terminar el hilo, parece ser que aqui esta el problema, lo voy a probar en la tarde y te aviso segun me de el resultado.

salu2
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