#java #sockets #networking #inputstream #objectinputstream
Вопрос:
Я пытаюсь отправлять файлы по частям из клиента на сервер с помощью byte
массивов. Я использую ObjectInputStream
. Запись работает, и размер файла совпадает, но когда я открываю файл, я получаю только пустой текстовый файл(который отображается при открытии в IDE NUL,NUL,NUL...
).
Код сервера:
try( FileOutputStream fileOut = new FileOutputStream(file); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); ){ byte[] arr = new byte[chunkSize]; try { int len = 0; long bytesRead = 0; byte[] bytes = new byte[chunkSize]; int chunkNo = 1; while(true) { len = in.read(bytes,0, chunkSize); System.out.println(); if(len lt; 0) break; fileOut.write(arr, 0, len); bytesRead = len; out.writeObject(Server.CHUNK_ACKNOWLEDGE_MSG); String ackReply = (String) in.readObject(); if(ackReply.equalsIgnoreCase((Server.UPLOAD_ACKNOWLEDGE_RECEIVE_TIMEOUT_MSG))){ if(Server.DEBUG) System.out.println(fileName " send timeout."); deleteFile(); break; }else if (ackReply.equalsIgnoreCase(Server.UPLOAD_COMPLETE_MSG)){ if(bytesRead != fileSize){ System.out.println(fileName " File size mismatch"); deleteFile(); break; }else{ System.out.println( fileName " File written"); break; } } } }catch (IOException ioe){ if(Server.DEBUG) ioe.printStackTrace(); }
Код клиента:
try( FileInputStream fileInput = new FileInputStream(file); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); ){ byte[] arr = new byte[chunkSize]; try { int len = 0; int bytesRead = 0; int chunkCount = 1; while((len = fileInput.read(arr, 0, chunkSize)) != -1) { out.write(arr, 0, len); out.flush(); bytesRead = len; } try { System.out.println("wait ack"); socket.setSoTimeout(timeout); String ack = (String) in.readObject(); System.out.println(ack); if(bytesRead gt;= fileSize){ out.writeObject(Server.UPLOAD_COMPLETE_MSG); System.out.println(Server.UPLOAD_COMPLETE_MSG); break; }else{ out.writeObject(Server.CHUNK_ACKNOWLEDGE_MSG); } }catch (SocketTimeoutException e){ out.writeObject(Server.UPLOAD_ACKNOWLEDGE_RECEIVE_TIMEOUT_MSG); System.out.println(Server.UPLOAD_ACKNOWLEDGE_RECEIVE_TIMEOUT_MSG); break; }finally { socket.setSoTimeout(0); } } } }catch (IOException ioe){ ioe.printStackTrace(); } }catch (FileNotFoundException fnfe){ System.out.println("No such file: " fileName); }catch (Exception e){ e.printStackTrace(); } finally { try { socket.close(); }catch (Exception ex){ ex.printStackTrace(); } }
Я попытался записать byte
массив в другой файл на стороне клиента, и копия была идентична. Таким образом, проблема должна быть во время отправки данных через сокет.
Сервер.X_MSG-это просто постоянная строка. Я не знаю, вызывает ли смешивание readobject()
и read(bytearray)
то же ObjectInputStream
самое какие-либо проблемы.
Комментарии:
1. Я не понимаю
try(
синтаксиса, никогда его не видел. Какую версию Java вы используете?2. @kiner_shah Это обычная попытка с синтаксисом ресурсов. Это должно быть равносильно тому, чтобы закрыть их заявлением «наконец».
Ответ №1:
Может быть, это потому fileOut.write(arr, 0, len);
, что пользуешься arr
и len = in.read(bytes,0, chunkSize);
пользуешься bytes
? Они не являются одним и тем же массивом.