2016-03-11 7 views
0

Im работает на TFTP-сервере. На основе изображения максимальная длина моих пакетов составляет 516 байт (2 + 2 + 512).Как получить имя файла из DatagramPacket RRQ?

Я пытаюсь взять исходную длину от datagrampacket клиента (в этом случае отправляет 13 байт в пакете RRQ), вместо этого я получаю длину datagrampacket сервера (516 байт), где я сохраняю datagrampacket клиента.

Мне нужно, чтобы для извлечения имени файла я сделал это, но содержимое строки «filename + nullBytes», эти нулевые байты исходят от серверного datagrampacket.

Это код, где застрял им:

public static short RRQ = 1; 
     enter code here 
    public void dataMetod() throws IOException{ 
         byte[] packet = new byte[516]; 
         //socket with listening port 5000 
         DatagramSocket datagramSocket = new DatagramSocket(5000); 

        //while receive packets 
        while (true) { 
        DatagramPacket datagramPacket = new DatagramPacket(packet,packet.length); 
        datagramSocket.receive(datagramPacket); 
        System.out.println("server: new packet!!:"); 

        //create a byte[] with the "received packet length"(that's not true) 
        byte[] inData = new byte[datagramPacket.getLength()]; 
        inData = datagramPacket.getData(); 

        System.out.println("length: "+inData.length); 
        byte code; 
        code = inData[1]; 
        System.out.println(code); 

        //check if its an RRQ packet 
        if (code == RRQ) { 
         System.out.println("server: RRQ PACKET!!"); 
         String fileName = this.getFileName(inData); 
         System.out.println(fileName); 


       } 

public String getFileName(byte[] inData) { 
     byte[] aux = new byte[inData.length - 7]; 
     for (int i = 0; i < aux.length; i++) { 
      aux[i] = inData[i + 2]; 
     } 
     return new String(aux); 
    } 

http://i.stack.imgur.com/6dTH6.png

+0

Как вы знаете, клиент на самом деле отправил только 13 байтов? Какой клиент вы используете? – JimmyB

+0

ОК, извините его мой первый пост, работая над ним. – tec01

+0

TFTP говорит, что «имя файла имеет нулевое завершение». Может быть, вам стоит положиться именно на это. – JimmyB

ответ

0

Попробуйте это:

public String getFileName(byte[] inData) { 

    final int maxLen = inData.length; 

    final StringBuilder sb = new StringBuilder(); 

    int i = 2; 
    byte b; 

    while ((i < maxLen) && (b = inData[i]) != 0) { 
     final int v = ((int)b) & 0xff; 
     sb.append((char) v); 
     i++; 
    } 
    return sb.toString(); 
} 
+0

В нем говорится: Исключение в потоке «main» java.lang.NullPointerException: null address || null buffer – tec01

+0

Я пробовал что-то вроде поиска индекса байта (0 + mode + 0) в inData (с Arrays.binarySearch()), возможно, есть способ с этим, но я не пришел, чтобы получить исходную длину. – tec01

+0

Я думал о написании if(), который сравнивается с нулевыми байтами и возвращает строку в 1-м нулевом байте, который он нашел, но я не нашел сравнения с нулевыми байтами. – tec01

0

Вместо того, чтобы исходную длину полученного пакета (для поиска имени файла через массив), мы могли бы это сделать, добавив «\ n» в fileName String в классе клиента, затем используйте BufferedReader, который обнаружит «\ n» и сохранит имя_файла. Код:

public String getFileName(byte[] inData) throws IOException { 

    //get a sub-array, from index[2] (beacuse we dont want opCode) to inData length 

     byte[] b =Arrays.copyOfRange(inData, 2, inData.length); 

     InputStream is = new ByteArrayInputStream(b); 
     BufferedReader bf = new BufferedReader(new InputStreamReader(is)); 

    //We read a word that will be saved when "\n" is found. 
    //(adding "\n" previously to the fileName String in client class) 

     String filename = bf.readLine(); 
     bf.close(); 
     is.close(); 
     System.out.println("server: filename is: "+filename.length()+" bytes"); 
     return filename; 
}