Шаблон Java для последующего Input & OutputStream - PullRequest
0 голосов
/ 15 сентября 2018

Привет, мир переполнения стека, я некоторое время боролся с самой простой и распространенной проблемой в Java IO, и теперь мне нужна ваша помощь для ее решения.

Ознакомьтесь с этим фрагментом кода, который у меня есть в блоке try, в thread.run ():

                // connect to client socket, and setup own server socket
                clientSocket = new Socket(serverHostname, CLIENT_PORT);

                //send a test command to download a file
                String downloadFileName = "sample.txt";
                DataOutputStream dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
                System.out.println("Sending a request to download file : " + downloadFileName + " from user: Arsa node"); //todo: replace with node user later
                dataOutputStream.writeUTF("D/sample.txt");

                //close socket if host isn't detected anymore, and if socket doesn't become null suddenly
                dataOutputStream.flush();
                dataOutputStream.close();
                System.out.println("****File has been sent****");

                in = new DataInputStream(clientSocket.getInputStream());
                byte[] retrievedFileData = new byte[8036];


                if (in.readInt() > 0) {
                    System.out.println("Starting file download!");
                    in.read(retrievedFileData);
                    System.out.println("File data has been read, converting to file now");

                //closing input stream will close socket also
                    in.close();
                }

                clientSocket.close();

2 Основные вопросы, которые приводили меня в замешательство до смерти:

  • Почему dataOutputStream.close () необходимо запустить для writeUTF, чтобы фактически отправить мою строку в сокет сервера, я обнаружил, что когда у меня нет dos.close (), данные не 't извлекается с другой стороны, кроме того, потому что я закрываю его, я больше не могу читать из сокета - так как кажется, что соединение сокета закрывается, когда выходной поток ранее был закрыт ...

    • Чтолучший способ, следуя какой-то схеме, чтобы сделать это?Для контекста все, что я пытаюсь сделать, это написать имя файла, которое я ищу, чтобы загрузить на мой клиент, а затем сразу же прочитать ответ, который, как я ожидаю, будет байтами с файлом, любую обработку ошибок я буду рассматривать как частьмоего развития.

В общем, не должно быть сложным что-то записать в сокет, а затем прочитать и принять его ответ ... что здесь не так,любая помощь будет принята с благодарностью!Если вам понадобится фрагмент кода ServerSocket, я с удовольствием поделюсь с вами.

1 Ответ

0 голосов
/ 15 сентября 2018

Наблюдаемое поведение является всего лишь побочным эффектом close(), так как он вызывает flush() перед закрытием, чтобы убедиться, что любые буферизованные данные отправлены.Чтобы решить вашу проблему, вам нужно вызвать метод flush() вместо закрытия.

Это поведение не уникально для DataOutputStream: многие другие реализации OutputStream (или Writer) применяют буферизациюи вам нужно будет выполнить сброс, если вы хотите убедиться, что данные отправляются клиенту, записываются на диск или иным образом обрабатываются.

Кстати: DataOutputStream и DataInputStream предназначены для очень специфического типапротокол сериализации данных, характерный для Java.Вы можете тщательно обдумать, подходит ли этот протокол для использования.

...