cv2.waitKey () возвращает 32-битное целочисленное значение (может зависеть от платформы). Ввод ключа находится в ASCII, который представляет собой 8-битное целочисленное значение. Таким образом, вы только заботитесь об этих 8 бит и хотите, чтобы все остальные биты были равны 0. Этого можно достичь с помощью:
cv2.waitKey(0) & 0xFF
Вы читаете сокет до тех пор, пока 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)
у отправителя перед отправкой данных.
Я сделал это так, он работает отлично, вы можете взглянуть:
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();
}
DataOutputStream
после каждой передачи файла, он фактически закрывает базовый поток, и, следовательно, сокет является закрытым. Close()-Closes this output stream and releases any system resources associated with the stream.
Javadocs.
– Nikhar
29 April 2012 в 17:16
shutdownOutput
указатьEOF
? – Cratylus 29 April 2012 в 10:57Math.min()
- правильно обрабатывать последний буфер. Вы не можете предположить, что размер файла кратен вашей длине буфера. – user207421 1 May 2012 в 00:31