Сокет Java получает только символы NUL после записи массива байтов

#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 ? Они не являются одним и тем же массивом.