Запись байтов в файл из нескольких пакетов

#java #sockets #networking #file-writing

#java #сокеты #сеть #запись в файл

Вопрос:

я работаю над алгоритмом, который будет получать данные, и я хочу записать их в файл. Первый пакет, который я получаю, — это пакет, содержащий имя файла. Второй пакет содержит sizeOfPacket. затем я должен вычислить количество пакетов, которые я получаю. Но моя реальная проблема начинается, когда я хочу получать следующие пакеты и записывать эти пакеты в файл побайтно. Я пробовал это многими способами, но каждый раз результирующий файл имеет размер всего 1 КБ, а фактическое изображение — 72 КБ. Я должен читать из пакетов с 4-го байта, потому что первые 4 байта хранят позицию пакета в файле.

Размер каждого пакета равен 1024B

 public void run(int port) throws IOException {    
      try {
            byte[] receiveData = new byte[1024];
            DatagramSocket serverSocket = new DatagramSocket(port);

            System.out.printf("Listening on udp:%s:%d%n",
            InetAddress.getLocalHost().getHostAddress(), port);     
            DatagramPacket receivePacket = new DatagramPacket(
                               receiveData,
                               SIZE_OF_PACKET
                               );

            //first packet with name of file
            serverSocket.receive(receivePacket);
            String fileName = utils.getFileName(receivePacket);

            //System.out.println(fileName);
            //System.out.println(fileName.length());

            //second packet with size of whole data()
            serverSocket.receive(receivePacket);
            int sizeOfFile = utils.BytesToInt(receivePacket);

            //get number of packets that are needed
            int numOfPackets = utils.getNumOfPackets(sizeOfFile);
            //System.out.println(sizeOfFile);
            //System.out.println(numOfPackets);

            //output stream for file "test.jpg"
              FileOutputStream fos = new FileOutputStream("test.jpg");
              //loop over for the number of Packets
              for(int i = 0; i < numOfPackets - 1; i  ) {
                  serverSocket.receive(receivePacket);
                  receiveData = receivePacket.getData();
                  //byte byte after byte and write it to the file
                  // start at index 3 bcs first byte is packet number
                  for(int a = 3; a < SIZE_OF_PACKET - 1;a  ) {
                      Byte nextByte = receiveData[a];
                      if(nextByte != 0) fos.write(nextByte);

                  }

              }
              fos.close();
              serverSocket.close();

      } catch (IOException e) {
          e.printStackTrace();
    }
  

Комментарии:

1. Каково значение SIZE_OF_PACKET ?

2. Почему вы удаляете 0 байты. Как вы гарантируете, что каждый файл является точным кратным SIZE_OF_PACKET Что, если файл другого размера?

3. предварительно определено, что размер пакета будет 1024