[URL="http://i.stack.imgur.com/6dTH6.png"]normas de paquetes[/URL]
edit: entiendo porque no genera el enlace jeje
Mi probema es que cuando el paquete RRQ del cliente llega al servidor no puedo saber la longitud original del contenido, ya que, cuando llega el paquete tengo que guardarlo en uno predefinido (new DatagramPacket) en la clase server. A este paquete de la clase server le doi un buffer de 516 bytes (o menor, segun la imagen para paquetes de tipo Data son maximo 516 bytes). Entonces cuando hago un datagrampaquet.getLength en el servidor, me da la longitud del paquete que creé en el server no del cliente.
Código:
Ahora, cuando imprimo el nombre del fichero, me imprime nombre+byteNulos. public void metodoData() throws IOException{//bufferde bytes para el datagrampacketbyte[] packet = new byte[516];//modo de trabajo - lo deberia usar en algun momento para restar bytes que no quiero al array de datosbyte binariMode = (byte) "octet".length();//creamos un socketDatagramSocket datagramSocket = new DatagramSocket(5000); //mientras reciba while (true) { boolean ackRecibidos=true; int i=0;//creamos un datagrampacket con el byte[] anteriormete definidoDatagramPacket datagramPacket = new DatagramPacket(packet,packet.length);//recibimos un paquetedatagramSocket.receive(datagramPacket); System.out.println("servidor: llego un paquete!!:"); //creamos un byte[] de la longitud original del contenido(mentira!!!) byte[] inData = new byte[datagramPacket.getLength()];//obtenemos los bytes del paquete. Esto me da los bytes que tienen valor mas los nulos del datagrampacket del servidorinData = datagramPacket.getData(); System.out.println("el fichero mide "+inData.length); // comprobamos si es un paquete RRQ byte code; code = inData[1]; System.out.println("servidor: codigo "+code); //si es una peticion de lectura if (code == RRQ) { System.out.println("servidor: Es un RRQ!!");//obtengo el nombre del fichero. Este metodo me lo copie de internet. no funciona del todo bien.String fileName = this.getFileName(inData, inDataLength); System.out.println(fileName); public String getFileName(byte[] inData, ) { byte[] aux = new byte[inData-7]; for (int i = 0; i < aux.length; i++) { aux[i] = inData[i + 2]; } System.out.println("server: el nombre del fichero mire: "+aux.length); return new String(aux); }
Entonces pense, de poner un if que leyera el fileName y al primer byte null que encuentre saliera y devolviera el fileName sin byte nulos, pero no encontre una equivalencia para igualar a bytes nulos.
Si no me explique bien, comenten pls.
Todo esto porque no logro extraer el filename del paquete que llega del cliente