JSF - lectura desde socket a fichero erronea en linux

 
Vista:
sin imagen de perfil

lectura desde socket a fichero erronea en linux

Publicado por david (1 intervención) el 09/04/2021 13:26:54
Buenos días a todos

Tengo un problema relacionado con la escritura de ficheros en linux. resulta que estoy leyendo datos de una maquina remota por telnet abriendo un socket y los resultados los guardo temporalmente en un archivo antes de guardarlos a la base de datos para no eternizar la conexión con la maquina remota cuando existan muchos datos.

la aplicación esta desplegada en un servidor wildfly y la tarea se ejecuta en al inicializar el contexto lanzando un hilo que despierta cada x minutos. El caso es que cuando lo ejecuto en mi ordenador que es windows 10. java 8 y wildfly 20. todo funciona perfectamente pero cuando lo ejecuto en la maquina de produccion que lo unico que cambia es que se trata de debian 10. No lee los registros bien. al guardar el archivo los datos aparecen con mas bytes de la cuenta.

expongo el codigo:

@Override
public void run() {
// System.out.println("registrando tiempo real");
Socket socket = null;
DataInputStream in = null;
DataOutputStream ou = null;

// establish socket connection to server
try {
socket = new Socket();
socket.setSoTimeout(10000);// tiempo maximo de lectura 10 s
SocketAddress socketAddress = new InetSocketAddress("10.102.161.14", 23);// conectamos con la estación
socket.connect(socketAddress);
in = new DataInputStream(socket.getInputStream());
ou = new DataOutputStream(socket.getOutputStream());
BufferedReader b = new BufferedReader(new InputStreamReader(in));
escribe(ou, Constantes.INIT);
leeRespuesta(b);
escribe(ou, Constantes.ECHOOFF);
leeRespuesta(b);
escribe(ou, Constantes.VERBOSEOFF);
leeRespuesta(b);
escribe(ou, Constantes.INPUTVAL);
String trama = leeRespuesta(b);
escribe(ou, Constantes.RETRIEVE);
boolean hayRegistro = leerRetriave(b, pathTemp);// lee los registros en caso de que estos existan.
escribe(ou, Constantes.EXIT);// envia fin de comunicacion
socket.close();// terminanos la conexion;
TiempoReal tiempo = dameBean(trama);
TiempoRealService servicio = new TiempoRealService();
servicio.create(tiempo);// grabamos en la base de datos
if (hayRegistro)
guardaRegistros(pathTemp);// si hubo datos de los registros los persistimos.
in.close();
ou.close();//cerramos la conexion
} catch (java.net.SocketTimeoutException ste) {// TODO: introducir loggin
System.out.println("tiempo para conexion excedido o conexion rechazada.");
} catch (UnknownHostException ue) {
// ue.printStackTrace();
System.out.println("host desconocido.");
ue.printStackTrace();
} catch (IOException ei) {
// TODO: handle exception
ei.printStackTrace();
} catch (NullPointerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("intento de impresion de valor nulo");
} catch (Exception eg) {
System.out.println("error general");
eg.printStackTrace();
}
}

/*
* metodo para leer la trama del comando RETRIEVE
* para muchos datos requerira un excesivo uso de memoría RAM
* se cargan los datos en un fichero temporal.
* el metodo devuelve el path del fichero temporal en caso de que la lectura sea correcta
* o null en caso de que no existan registros.
* */
private static boolean leerRetriave(BufferedReader b,String path) throws IOException {

boolean datosPresentes=false;
File temp=new File(path);//datos
if(temp.exists()) {//si el archivo existe lo borramos y volvemos a crear otro
temp.delete();
temp.createNewFile();
}else {//si no existe se crea otro.
temp.createNewFile();
}
PrintWriter p=new PrintWriter(temp);
int i=0;
for (int j = 0; j < 7; j++) {
i=b.read();
p.print((char)i);
}//se lee la cabecera de los datos que es /rIQ150/r 7 bytes
i=b.read();
p.print((char)i);
if(i==Constantes.INICIAL) {
datosPresentes=true;//si hay aunque sea un registro hay datos.
while(i!=Constantes.FINFILE) {//mientras no encuentre un 04hex (final de transmision) sigue leyendo.
for (int j = 0; j <183 ; j++) {
i=b.read();
p.print((char)i);
}//se lee un registro entero de golpe: 5bytes x 35 variables + 5 bytes de fecha + 3 bytes de crc total 183 bytes
i=b.read();
p.print((char)i);
}
}
p.print((char)i);//escribimos el byte de fin de fichero.
p.close();
if(datosPresentes){//si existen registros delvolvemos el path del archivo temporal.
System.out.println("hay datos en: "+path);
}else {
System.out.println("no hay registros nuevos");
}
return datosPresentes;
}
}

No incluyo màs código porque creo que el fallo esta aquí. de hecho sospecho que el problema esta en la forma que se leen y guardan los caracteres b.read() lee un caracter y p.print((char)) imprime ese caracter al fichero. lo que ocurre es que en la transmision de los registros lo que se recibe son bytes binarios. despues de un 0x03 se reciben 4 bytes, depues de un 0x02 se reciben otros 4 bytes pero los character pueden contener 2 bytes en lugar de uno dependiendo de la codificación. no se como cambiar esa codificacion.

Bueno si hay otra cosa que pueda estar mal agradezco los comentarios. gracias y un saludo.
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