JAVA - Сервер NIO и Client IO [дубликат]

cv2.waitKey () возвращает 32-битное целочисленное значение (может зависеть от платформы). Ввод ключа находится в ASCII, который представляет собой 8-битное целочисленное значение. Таким образом, вы только заботитесь об этих 8 бит и хотите, чтобы все остальные биты были равны 0. Этого можно достичь с помощью:

cv2.waitKey(0) & 0xFF
20
задан Tom 5 28 April 2012 в 22:35
поделиться

2 ответа

Вы читаете сокет до тех пор, пока read() не вернет -1. Это условие конца потока (EOS). EOS происходит, когда партнер завершает соединение. Не когда он заканчивает запись одного файла.

Вам нужно отправить размер файла перед каждым файлом. Вы уже делаете подобное с количеством файлов. Затем убедитесь, что вы прочитали точно столько байтов для этого файла:

String filename = dis.readUTF();
long fileSize = dis.readLong();
FileOutputStream fos = new FileOutputStream(filename);
while (fileSize > 0 && (n = dis.read(buf, 0, (int)Math.min(buf.length, fileSize))) != -1)
{
  fos.write(buf,0,n);
  fileSize -= n;
}
fos.close();

Вы можете заключить все это в цикл, который завершается, когда readUTF() выбрасывает EOFException. Наоборот, вы должны вызывать writeUTF(filename) и writeLong(filesize) у отправителя перед отправкой данных.

23
ответ дан user207421 20 August 2018 в 09:11
поделиться
  • 1
    Невозможно ли shutdownOutput указать EOF? – Cratylus 29 April 2012 в 10:57
  • 2
    @ user384706 Да. Один раз за соединение. Таким образом, вы можете отправить только один файл. – user207421 29 April 2012 в 11:07
  • 3
    Это сработало отлично, Im запутался в части n = dis.read (buf, 0, Math.min), определяет ли math.min, размер файла меньше размера буфера? и если да, то он будет только частично заполнять буфер только файлом.length? – Tom 5 30 April 2012 в 15:41
  • 4
    @Tom Math.min() - правильно обрабатывать последний буфер. Вы не можете предположить, что размер файла кратен вашей длине буфера. – user207421 1 May 2012 в 00:31
  • 5
    Спасибо @EJP ... это хорошая вещь, чтобы узнать :) – DkPathak 21 October 2013 в 08:04

Я сделал это так, он работает отлично, вы можете взглянуть:

send

byte[] done = new byte[3];
String str = "done";  //randomly anything
done = str.getBytes();
for(int i =0; i < files.size(); i++){
    System.out.println(files.get(i).getName());
    FileInputStream fis = new FileInputStream(files.get(i));
    while((n =fis.read(buf)) != -1){
        dos.write(buf,0,n);
        System.out.println(n);
        dos.flush();
    }
 //should i close the dataoutputstream here and make a new one each time?                 
    dos.write(done,0,3);
    dos.flush();
}
        //or is this good?
        dos.close();

recieve

for(int i = 0; i < files.size();i++){
    System.out.println("Receiving file: " + files.get(i).getName());
 //create a new fileoutputstream for each new file
fos = new FileOutputStream("C:\\users\\tom5\\desktop\\salestools\\" +files.get(i).getName());
//read file
while((n = dis.read(buf)) != -1 && n!=3 ){
        fos.write(buf,0,n);
        fos.flush();
        }
            fos.close();
        }
1
ответ дан Nikhar 20 August 2018 в 09:11
поделиться
  • 1
    благодаря вашей проблеме я узнал что-то новое, что вы просили закрыть DataOutputStream после каждой передачи файла, он фактически закрывает базовый поток, и, следовательно, сокет является закрытым. Close()-Closes this output stream and releases any system resources associated with the stream. Javadocs. – Nikhar 29 April 2012 в 17:16
  • 2
    hmmm, я отправляю размер файла и сохраняю его в массиве int. Я добавил это на свой сервер во время цикла, while ((n = dis.read (buf))! = -1 & amp; bytesRead & lt; fileSize)); – Tom 5 30 April 2012 в 14:27
  • 3
    хорошо, я тоже это пробовал, но была потеря / выигрыш в несколько байтов. Просто проверьте последний файл, который был перенесен, потеряет ли он несколько байтов? – Nikhar 30 April 2012 в 14:56
  • 4
    например, получая 5 файлов, иногда он получает все байты в первых трех итерациях, а 2 последних файла - 0 байт, иногда он получает байты на 4-ю итерацию. Было довольно случайным – Tom 5 30 April 2012 в 16:18
  • 5
    Хотя, прочитайте вышеприведенную запись, где Math.min был добавлен к while ((n = dis.read (buf, 0, Math.min (n, FileSizes [i])). Это полностью исправило проблему, но скремблировало мой мозг в процессе – Tom 5 30 April 2012 в 16:20
Другие вопросы по тегам:

Похожие вопросы: