DataInputStream readLong() получает неправильное значение

Привет у меня возникли проблемы с readLong() метод DataInputStream. Когда я ставлю значение через DataOutputStream.writeLong() это правильное значение, но когда оно отправлено, оно намного больше, чем должно быть, у меня есть весь код в рабочем состоянии, чтобы программа не зависала

это клиент

    socket = new Socket(ipAddress, Port);

    bos = new BufferedOutputStream(socket.getOutputStream());
    dos = new DataOutputStream(bos);

    File f = new File("C:/Users/lukeLaptop/Downloads/RemoveWAT22.zip");

    long length = f.length();
    dos.writeLong(length);

    String name = f.getName();
    dos.writeUTF(name);

    FileInputStream fis = new FileInputStream(f);
    bis = new BufferedInputStream(fis);

    int theByte = 0;
    while ((theByte = bis.read()) != -1) {
        bos.write(theByte);
    }
    bis.close();

    dos.close();

серверная сторона

    ServerSocket server = new ServerSocket(8080);

    while (true) {
        socket = server.accept();

        System.out.println("Got a client !");

        bis = new BufferedInputStream(socket.getInputStream());

        dis = new DataInputStream(bis);

        int filesCount = dis.readInt();



        long fileLength = dis.readLong();
        //String fileName = dis.readUTF();

        File f = new File("C:/test/here/test.zip");

        FileOutputStream fos = new FileOutputStream(f);
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        for (int j = 0; j < fileLength; j++) {
            bos.write(bis.read());
        }

        bos.close();
        dis.close();

РЕДАКТИРОВАТЬ

Если кто-то может помочь мне с кодом, то очень признателен, что я новичок в сокетах, и я немного запутался в вещах, все, что я хотел, это отправить длину файла с помощью метода writeLong dataoutputstream и также отправить имя с writeUTF, но я не знаю, что происходит и как это исправить

2 ответа

Проблема в методе writeUTF,

Джавадок говорит:

Записывает строку в базовый выходной поток с использованием модифицированной кодировки UTF-8 машинно-независимым способом.

Во-первых, два байта записываются в выходной поток, как если бы он был записан методом writeShort, дающим количество байтов для последующего. Это значение - количество фактически записанных байтов, а не длина строки. После длины каждый символ строки выводится последовательно с использованием модифицированной кодировки UTF-8 для символа. Если исключение не выдается, записанный счетчик увеличивается на общее количество байтов, записанных в выходной поток. Это будет как минимум два плюс длина str, и самое большее два плюс три раза длина str.

Но вы используете свою собственную кодировку длины, которая принимает только количество символов, которое содержит строка. Он не использует закодированную длину вашей строки.

Вам не нужно использовать собственную кодировку длины, если вы используете DataInputStream.readUTF() читать твою строку.

Сервер отправляет это:

dos.writeLong(length);
dos.writeUTF(name);

сопровождаемый файлом.

Клиент читает это:

int filesCount = dis.readInt();
long fileLength = dis.readLong();
//String fileName = dis.readUTF();

сопровождаемый файлом.

Итак, вы читаете filesCount что вы вообще не отправляете и не читаете fileName что вы отправляете. Так как это может работать?

Если вы не прочитали в точности то, что отправляете, с дополнительными методами, это не сработает.

Другие вопросы по тегам