2016-01-22 25 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

如果要重新發送包含更改的同一對象,則需要在每個writeObject(),之前使用ObjectOutputStream.writeUnshared(),ObjectOutputStream.reset()。否則,只發送原始對象的句柄。

或者每次發送創建一個新的對象。