2016-01-22 2 views
0

В настоящее время я работаю над программой передачи файлов. Тем не менее, я столкнулся с серьезной проблемой. Сначала я задавался вопросом, почему, когда я получал файлы на одном конце, он создавал бы пустой файл. Позже я узнал, что по какой-то причине объект, который я отправил, отличался от объекта, который я получил. я послал объект Сообщение:Объект отправлен отличается от полученного объекта

public class Message implements Serializable { 


    private static final long serialVersionUID = 566740029496308507L; 
    private HashMap<MType, Object> map = new HashMap<MType, Object>(); 

    public Message(MType id, Object value) { 
     map.put(id, value); 
    } 
/* methods */ 

} 

Использование внутренней HashMap, я сохранил такие значения, как байты файла.

 BufferedInputStream is = new BufferedInputStream(new FileInputStream(src)); 
     Message msg = new Message(MType.FILE_OPEN, true); 
     com.transmit(msg); 
     byte[] buf = new byte[Utility.bufferSize]; 
     msg = new Message(MType.FILE_NAME, src.getName()); 
     msg.setValue(MType.FILE_SIZE, Files.size(src.toPath())); 
     com.transmit(msg); 
     for (int count = is.read(buf); count > 0; count = is.read(buf)) { 

      msg.setValue(MType.FILE_BYTE, buf); 
      msg.setValue(MType.FILE_COUNT, count); 
      com.transmit(msg); 
      System.out.println("File part sent"); 

     } 
     System.out.println("File sending complete"); 
     msg = new Message(MType.FILE_NAME, src.getName()); 
     msg.setValue(MType.FILE_SIZE, Files.size(src.toPath())); 
     msg.setValue(MType.FILE_CLOSE, true); 
     is.close(); 
     com.transmit(msg); 

Если функция передачи непосредственно пишет объект сообщения. Однако на принимающей стороне < я заметил несоответствие между отправленным сообщением и принятым сообщением. На принимающей стороне отправляются сообщения, но ни одна из их внутренних карт никогда не содержит значений FILE_BYTE и FILE_COUNT. Это как если бы в цикле, он только отправляет значение «msg» перед циклом, не учитывая добавление новых значений. Я знаю это, потому что я сделал метод ToString для сообщения и вот как это выглядит:

Отправленное сообщение:

============================================ 
USERNAME { 
    Bob 
} 
FILE_OPEN { 
    true 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_SIZE { 
    27252 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_COUNT { 
    8192 
} 
FILE_BYTE { 
    [[email protected] 
} 
FILE_SIZE { 
    27252 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_COUNT { 
    8192 
} 
FILE_BYTE { 
    [[email protected] 
} 
FILE_SIZE { 
    27252 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_COUNT { 
    8192 
} 
FILE_BYTE { 
    [[email protected] 
} 
FILE_SIZE { 
    27252 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_COUNT { 
    2676 
} 
FILE_BYTE { 
    [[email protected] 
} 
FILE_SIZE { 
    27252 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_CLOSE { 
    true 
} 
FILE_SIZE { 
    27252 
} 

============================================ 

Полученное сообщение:

============================================ 
USERNAME { 
    Bob 
} 
FILE_OPEN { 
    true 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_SIZE { 
    27252 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_SIZE { 
    27252 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_SIZE { 
    27252 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_SIZE { 
    27252 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_SIZE { 
    27252 
} 

============================================ 

============================================ 
FILE_NAME { 
    logo.jpg 
} 
USERNAME { 
    Bob 
} 
FILE_SIZE { 
    27252 
} 
FILE_CLOSE { 
    true 
} 

============================================ 

Если есть другой код Я должен опубликовать, пожалуйста, дайте мне знать. Спасибо :)

ответ

1

Перед тем, как переадресовать один и тот же объект с изменениями, вам необходимо использовать ObjectOutputStream.writeUnshared(), или ObjectOutputStream.reset() перед каждым writeObject(),. В противном случае отправляется только дескриптор исходного объекта.

Или создайте новый объект для отправки.

Смежные вопросы