Я пишу программу, в которой есть клиент и сервер, где клиент будет отправлять файл 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");
Это изображение является результатом, где сервер находится сверху, а клиент — снизу. Вот где я обнаружил, что сервер застрял в блокировке.
Вот я нашел этот метод и попытался заставить его работать для моей установки. Я впервые работаю с потоками.
-1
, вам нужно закрыть() писатель (здесьobOut
). Если вы не хотите этого делать, скажем, вы хотите отправить много файлов, тогда вам нужно создать свой собственный протокол (правила общения между клиентом и сервером). В таком протоколе должно быть указано, что сначала вы информируете сервер о том, сколько байтов он должен ожидать (длина файла), затем вместо ожидания -1 вы просто подсчитываете, сколько байтов было получено, и после того, как все они были получены, сервер может делать другие вещи. или дождитесь информации о другой задаче, которую он должен выполнить (например, о получении другого файла). - person Pshemo   schedule 16.09.2017