Сервер и клиент отправляют файл Java

Я пишу программу, в которой есть клиент и сервер, где клиент будет отправлять файл img на сервер. Приведенный ниже код предназначен для сервера, где он застрянет в этом цикле while из obIn.read, блокируя его при последнем запуске, поэтому он никогда не сможет вернуть -1 и разорвать цикл. Это прерывает цикл для моего клиента. Поэтому я попытался сбросить его после цикла на клиенте, но, похоже, это не помогло. Я не хочу закрывать obOut, потому что это, в свою очередь, закроет сокет, который я хочу оставить открытым. Конец сервера — это место, где он получает биты из obIn (входной поток, который является переменной экземпляра) и записывает их в файл, который я создал.

                  //server receives file
                    File file = new File("image/image.png");
                    BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream(file));
                    byte[] bytes = new byte[1000];
                    int c = 0;
                    while((c = obIn.read(bytes)) != -1) {
                        fileOut.write(bytes, 0, c);
                        fileOut.flush();
                        System.out.println(c);
                    }
                    System.out.println(c);
                    fileOut.close();
                    System.out.println("File Created");

                //Client
                String imgPath = in.nextLine();
                File file = new File(imgPath);

                BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream(file));
                byte[] bytes = new byte[1000];
                int c = 0;
                while((c = fileIn.read(bytes)) != -1) {
                    obOut.write(bytes, 0, c);
                    obOut.flush();
                    System.out.println(c);
                }
                obOut.write(bytes, 0, 1000);
                obOut.flush();
                System.out.println(c);
                fileIn.close();
                System.out.println("File Sent");

Это изображение является результатом, где сервер находится сверху, а клиент — снизу. Вот где я обнаружил, что сервер застрял в блокировке.

введите здесь описание изображения

Вот я нашел этот метод и попытался заставить его работать для моей установки. Я впервые работаю с потоками.


person Kayracer    schedule 15.09.2017    source источник
comment
Чтобы отправить -1, вам нужно закрыть() писатель (здесь obOut). Если вы не хотите этого делать, скажем, вы хотите отправить много файлов, тогда вам нужно создать свой собственный протокол (правила общения между клиентом и сервером). В таком протоколе должно быть указано, что сначала вы информируете сервер о том, сколько байтов он должен ожидать (длина файла), затем вместо ожидания -1 вы просто подсчитываете, сколько байтов было получено, и после того, как все они были получены, сервер может делать другие вещи. или дождитесь информации о другой задаче, которую он должен выполнить (например, о получении другого файла).   -  person Pshemo    schedule 16.09.2017


Ответы (1)


В своем клиентском классе попробуйте заменить функции write и flush вне цикла while на obOut.close();

person alireza    schedule 15.09.2017