En un proyecto que tengo entre manos estoy preparando un servidor proxy en java, donde evidentemente tendré datos de entrada por un puerto, y que posteriormente reenviaré tal como llegaron a otra dirección y puerto en concreto.
Actualmente me encuentro un poco atascado porque originalmente para capturar los
datos que se recivian por el socket lo hacía con un algoritmo complicado
con un in.read() pero por defecto read se queda unos segundos esperando
mientras no recibe TODOS los datos del socket antes de cerrarlo y eso me
esta dando algunos problemas y para más adelante sería más engorroso de
manejar(os pongo parte del codigo):
Código
byte[] buffer = new byte[4096]; int saved = 0; int len; for (;;) { if (done) { break; } len = buffer.length; // Used to be 1, but if we block it doesn't matter // however 1 will break with some servers, including apache if (len == 0) { len = buffer.length; } if (saved + len > buffer.length) { len = buffer.length - saved; } int len1 = 0; while (len1 == 0) { try { len1 = in.read(buffer, saved, len); if (done && (saved == 0)) break a; } len1 = -1; break; } } len = len1; if ((len == -1) && (saved == 0)) { break; } if (len == -1) { done = true; } // No matter how we may (or may not) format it, send it // on unformatted - we don't want to mess with how its // sent to the other side, just how its displayed if ((out != null) && (len > 0)) { //slowLink.pump(len); out.write(buffer, saved, len); } }
En xmltextAux se almacena en forma de cadena todos los bytes recividos
gracias al byte[] buffer = new byte[4096];...
Ahora estoy intentando pasar éste codigo a otro que utiliza funciones más
avanzadas(y sin espera) asi que todo lo anterior se resumiria en algo
similar a ésto:
Código:
InputStreamReader ir = new InputStreamReader(in);
BufferedReader r = new BufferedReader(ir);
while ((xmltextAUX = r.readLine()).trim().length() > 0) {
xmltext = xmltext + xmltextAUX;
}
System.out.println("MENSAJE:" + xmltext);
if ((out != null) && (xmltext.length() > 0)) {
System.out.println("INICIO8:");
//slowLink.pump(len);
//DataOutputStream dout = new DataOutputStream(out);
//dout.writeBytes(xmltext);
//Charset charset = Charset.forName("ISO-8859-1");
PrintWriter p = new PrintWriter(out, true);
p.write(xmltext);
//out.write(xmltext.getBytes(charset));
}
La parte de recibir por el socket de entrada el mensaje lo lee exactamente
igual que la otra funcion, pero a la hora de escribir lo que se ha
recibido por él para enviarlo por el socket "out" de salida algo falla
porque es como si no se enviara nada.
La mayor diferencia y donde creo que reside el problema es que en el
codigo antiguo el mensaje se recibia como una serie de bytes[] y se
enviaba directamente como los bytes[] que eran; y en la nueva version
vamos leyendo línea a línea como un string y luego lo mandamos como un
string y puede que haya algún problema de conversión, o de formato o algo
así que no se interpreta correctamente por el servidor.
Un saludo chicos y muchas gracias de antemano por leer tanta parrafada