El cliente haría esta petición:
GET /home/xmbeat/archivo.txt
BYTE-POS 10
__________________________
El servidor respondería así:
XmServer/1.0 GOOD
CONTENT-LENGTH 400
FILE-LENGTH 410
__________________________
[DATOS BINARIOS DE LONGITUD 400]
Como aprecian es parecido al protocolo http, pero no logro hacerlo funcionar, el programa funciona de esta manera: el servidor se pone a la escucha y por cada cliente que se conecte, crea un hilo que atienda sus peticiones hasta que el cliente decida desconectarse (esto es así para cada hilo), todo marcha bien pero en mi caso, siempre llegan los meta-datos, pero no siempre los datos binarios. En ocasiones hace lo que le digo, pero otras veces se queda esperando el paquete que nunca llega, aun cuando hago flush(), close(), pero nada!
Así que, supuse que el método write() debería estar fallando, por ejemplo, usando C, el método write() me indicaba cuantos datos se pudieron enviar, pero desafortunadamente en Java este método es void, así que no se si se enviaron o no. Esta es la parte del código que creo que falla:
Código
{ if (isReady()) { byte buffer[] = new byte[SIZE_BUFFER]; int sizeChunk = 0; { while((sizeChunk = entrada.read(buffer))>0) { salida.write(buffer, 0, sizeChunk); //he intentado con flush(), pero no! } } else if (_source instanceof byte[]) { byte src[] = (byte[])_source; int max = src.length / SIZE_BUFFER; int rest = src.length % SIZE_BUFFER; int i = 0; while (i < max) { salida.write(src, i*SIZE_BUFFER, SIZE_BUFFER); i++; } if (rest > 0) { salida.write(src, i*SIZE_BUFFER, rest); } } salida.flush();//Aseguramos que se envien, segun... } }
Adjunto el proyectohttps://dl.dropbox.com/u/81497136/src.zip
para compilarlo, ubicarse en la carpeta "src/" y desde el prompt ejecutar:
javac -d ../bin/ com/xmserver/componentes/*.java
javac -d ../bin/ com/xmserver/gui/*.java
Para ejecutar el server:
java -cp ../bin/ com.xmserver.gui.Main
Para ejecutar el cliente en otra shell usar:
java -cp ../bin/ com.xmserver.componentes.XmClientSession
ó
java -cp ../bin/ com.xmserver.componentes.XmClientSession; md5sum Song.mp3 Song2.mp3
Comentarios:
-Desbloquear el puerto 10500, o cambiarlo a gusto
-A mi en lo personal, el cliente funciona solo 2 veces, al 3er intento, se queda esperando un paquete que nunca es enviado, no sé porque, a pesar de que es un hilo aparte.
Ojalá hayan leído mi problema y puedan ayudarme, gracias!