DataInputStream read () всегда возвращает -1 - PullRequest
1 голос
/ 12 января 2020

У меня есть клиент-серверная программа в java, где клиент отправляет запрос на сервер, а сервер отвечает отправкой файла. Соединение с сервером установлено правильно, и первый запрос, отправленный клиентом, правильно интерпретируется сервером.

На этом этапе сервер считывает определенный файл c, который, кажется, хорошо читается, поскольку write отправляет правильное количество байтов и строку (проверяется с печатью количества байтов и строки).

После отправки первого сообщения клиент ожидает получения файла, но как только он получает сообщение, чтение возвращает -1, как если бы он прочитал EOF, и я не могу понять причину, как ее решить?

метод на сервере, когда отправить файл

private void sendFile(Socket client, String path, DataOutputStream writer) {
        File file = new File(path);
        byte[] bytes = new byte[1024];
        InputStream in = null;
        try {
            in = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        int count;
        try {
            while ((count = in.read(bytes)) > 0) {
                System.out.println("nBytes " + count);
                String tmp = new String(bytes);
                System.out.println(tmp);

                //i'm reading from a json file this string
                //[{"username":"user"},{"score":0},{"friendList":["us1","us2"]},{"password":"password"}]
                //and it is printed correctly

                writer.write(bytes, 0, count);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

метод на стороне клиента

public void getFile (String username) {
        // first of all connects correctly with the server and sends a message, the message is received correctly by the server, after it waits for a reply message

        Socket socket = connect2server();
        DataInputStream reader = null;
        BufferedWriter writer = null;


        try {
            reader = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //send message to the server using writer 

        OutputStream out = null;
        String file = username+".json";
        try {
            out = new FileOutputStream(file);
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        byte[] bytes = new byte[1024];

        int count;
        try {
            while ((count = reader.read(bytes)) >= 0) {
                System.out.println("nByte " + count);
                out.write(bytes, 0, count);
            }

            // the client is waiting correctly on the read but as soon as it receives a message, the read returns -1 as if it had only read an EOF and not the whole message

            System.out.println(count);
        } catch (IOException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }

        try {
            out.close();
            reader.close();
            writer.close();
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }

Ответы [ 2 ]

1 голос
/ 12 января 2020

Что касается write, вы не закрываете / очищаете выходной поток, который, в свою очередь, не освобождает ресурсы, связанные с этим потоком. У вас есть два варианта:

  1. Закрыть выходной поток, который вызывает его метод flu sh, а затем вызывает метод close его основного выходного потока.
  2. Flu sh буфер потока вывода. Буферизация выполняется для улучшения производительности I/O.

От до c, общий контракт read()

Читает следующий байт данных из входного потока. Байт значения возвращается как целое число в диапазоне от 0 до 255. Если байт недоступен, поскольку достигнут конец потока, возвращается значение -1. Этот метод блокируется до тех пор, пока не будут доступны входные данные, не обнаружен конец потока или не сгенерировано исключение. Подкласс должен обеспечивать реализацию этого метода.

Возвращает: следующий байт данных или -1, если достигнут конец потока.

1 голос
/ 12 января 2020

У вас sendFile() писатель не закрыт. Вам нужно flush(), а затем close() писатель, чтобы гарантировать, что выход будет создан. Может быть, это решит вашу проблему

...