gpt4 book ai didi

java - 发送的对象与接收的对象不同

转载 作者:行者123 更新时间:2023-12-01 10:33:33 24 4
gpt4 key购买 nike

我目前正在开发一个文件传输程序。然而,我面临着一个重大问题。我一开始想知道为什么当我在一端收到文件时,它只会创建一个空文件。后来我发现,由于某种原因,我发送的对象与我收到的对象不同。我发送了一个 Message 对象:

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);

其中传输函数直接写入Message对象。然而,在接收端<我注意到发送的消息和接收的消息之间存在差异。在接收端,消息被发送,但它们的内部映射都不包含 FILE_BYTE 和 FILE_COUNT 值。就好像在循环中,它只在循环之前发送“msg”的值,而不考虑新值的添加。我知道这一点是因为我为 Message 创建了一个 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 {
[B@5cea3875
}
FILE_SIZE {
27252
}

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

============================================
FILE_NAME {
logo.jpg
}
USERNAME {
Bob
}
FILE_COUNT {
8192
}
FILE_BYTE {
[B@5cea3875
}
FILE_SIZE {
27252
}

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

============================================
FILE_NAME {
logo.jpg
}
USERNAME {
Bob
}
FILE_COUNT {
8192
}
FILE_BYTE {
[B@5cea3875
}
FILE_SIZE {
27252
}

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

============================================
FILE_NAME {
logo.jpg
}
USERNAME {
Bob
}
FILE_COUNT {
2676
}
FILE_BYTE {
[B@5cea3875
}
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
}

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

如果我应该发布任何其他代码,请告诉我。谢谢:)

最佳答案

如果您想,您需要在每个 writeObject(), 之前使用 ObjectOutputStream.writeUnshared(),ObjectOutputStream.reset()重新传输经过更改的同一对象。否则,仅发送原始对象的句柄。

或者每次发送创建一个新对象。

关于java - 发送的对象与接收的对象不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34950756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com