Xenu
Xenu

Reputation: 11

Using Zip4J ZipOutputStream to send data to server socket

So I have this thing that I'm making and the problem is that I think that some bytes are lost while the file is compressed and send to server as well as saved locally. I was able to send data while not using ByteArrayOutputStream but I have to use it and can't just use socket's OutputStream directly as I need each sent file to have somwhat unique ID. Also sizes of out.zip and out2.zip are different by around 10kB (out2.zip is smaller) here is Log dump: https://pastebin.com/UyTqnRYc

Function that sends data in chunks

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ZipOutputStream zos = new ZipOutputStream(baos);
        ZipParameters zipParameters = buildZipParameters(compressionMethod);
        ObjectOutputStream objOS = new ObjectOutputStream(outputStream);
        File f = new File("out2.zip");
        FileOutputStream fos = new FileOutputStream(f);
        for (File directory:pathsToDirectories) {
            String relativeRootDirectory = directory.getName();
            List<File> filesAndDirectories = Arrays.stream(Objects.requireNonNull(directory.listFiles())).toList();
            for (File somefile:filesAndDirectories) {

                if(somefile.isDirectory()){
                    addDirectoryToZip(zos,somefile,zipParameters,relativeRootDirectory,rootDirectoryName);
                }
                else
                {
                    if (zipParameters.getCompressionMethod() == CompressionMethod.STORE) {
                        zipParameters.setEntrySize(somefile.length());
                    }
                    byte[] buff = new byte[4096];
                    zipParameters.setFileNameInZip(rootDirectoryName+ "/"+somefile.getName()); //YIKES
                    zos.putNextEntry(zipParameters);
                    try(InputStream inputStream = new FileInputStream(somefile)) {
                        int readLen;
                        while (((readLen = inputStream.read(buff)) != -1)) {
                            zos.write(buff);
                            byte[] b = baos.toByteArray();
                            System.out.println("written :"+baos.toByteArray().length);
                            objOS.writeObject(new TransportDataModel((byte) 1,baos.toByteArray()));
                            fos.write(baos.toByteArray());
                            baos.reset();
                            baos.flush();
                        }
                    }
                    zos.closeEntry();
                }

            }
        }
        objOS.writeObject(new TransportDataModel((byte) 1,baos.toByteArray()));
        zos.flush();


        System.out.println("REST OF IT :"+ Arrays.toString(baos.toByteArray()));
        System.out.println(baos.toByteArray().length);
        objOS.writeObject(new TransportDataModel((byte) 1,baos.toByteArray()));

        fos.write(baos.toByteArray());
        baos.reset();
        System.out.println("REST OF IT :"+ Arrays.toString(baos.toByteArray()));
        fos.flush();
        fos.close();
        objOS.writeObject(new TransportDataModel((byte) -1,new byte[0]));

        zos.close();

    }

Record used as a packet


import java.io.Serializable;

public record TransportDataModel(byte id, byte[] data) implements Serializable {
}

Server code:

public Server(int port)
    {
        // starts server and waits for a connection
        try
        {
            server = new ServerSocket(port);
            System.out.println("Server started");

            System.out.println("Waiting for a client ...");

            socket = server.accept();
            System.out.println("Client accepted");

            
            in = new ObjectInputStream(socket.getInputStream());
            File f = new File("out.zip");
            FileOutputStream outputStream = new FileOutputStream(f);
            

            TransportDataModel transportDataModel;
            while (true) {
                transportDataModel= (TransportDataModel) in.readObject();
                    if (transportDataModel.id() == -1) {
                        break;
                    }
                    if(transportDataModel.data().length != 0)
                    {
                        //System.out.println(transportDataModel.id());
                        outputStream.write(transportDataModel.data());
                    }


            }
            outputStream.flush();
            outputStream.close();
            System.out.println("Closing connection");

            // close connection
            socket.close();
            in.close();
            ZipFile zipFile = new ZipFile("out.zip");
            zipFile.extractAll("/home/xenu/IdeaProjects/BBT-BasicBackupTool");
        }
        catch(IOException i)
        {
            i.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

Upvotes: 0

Views: 455

Answers (0)

Related Questions