gpt4 book ai didi

java - 通过套接字在对象内发送文件字节

转载 作者:行者123 更新时间:2023-12-01 12:28:58 25 4
gpt4 key购买 nike

几天来我一直在尝试让它工作,但没有成功。

我想通过套接字客户端/服务器发送文件。唯一的区别是:我想发送一个包含文件字节的对象。

因此,客户端加载一个文件,读取 1024 字节的 block ,将它们存储在一个对象中,并将该对象发送到服务器。由于文件可能大于 1024 字节,因此我想重复发送该对象,但其中存储不同的字节(当缓冲区读取它时)。在服务器上,我想组成字节数组并将其保存为文件。

我使用 1024 的原因是因为我想避免任何类型的内存不足错误(假设文件大小为 4 GB)。

我尝试在客户端上执行以下操作:

File file = new File("C:\\test\\test.txt");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
byte[] bytes = new byte[1024];

FileTest ft = new FileTest();
ft.setName("Testing");
int counttest = 1;

while (bis.read(bytes) > 0) {
ft.setCounttest(counttest);
ft.setBytes(bytes);
oos.writeObject(ft);
counttest += 1;
}

在服务器上:

int bufferSize = socket.getReceiveBufferSize();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\test\\test2.txt"));
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
byte[] bytes = new byte[bufferSize];

while (true) {
FileTest ft = (FileTest) ois.readObject();
if (ft != null) {
System.out.println(ft.getName());
bos.write(ft.getBytes());
}
}

因此,我测试了发送一个包含数字序列的 txt 文件,服务器生成的 test2.txt 文件仅包含前 1024 个字节 block 重复两次。此外,在服务器中接收到 counttest 整数时,它永远不会增加。

知道如何实现这一点吗?

提前致谢。

最佳答案

您正在遇到 ObjectOutputStream 尝试保留对象标识的影响。重复写入相同的对象实例将导致接收器端出现相同的实例。这通常是一件好事,但如果您在发送方修改对象并期望这些修改显示在接收方一端,则会令人困惑。

因此,您有两个问题:

  1. 为了每次发送数据,您需要每次创建一个新的 FileTest 实例,或者使用 writeUnshared() 方法。
  2. 由于这种身份保留行为,您需要定期reset() ObjectOutputStream,以防止所有这些实例永久保留(并可能导致客户端或服务器上的 OOME) )。

关于java - 通过套接字在对象内发送文件字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26105972/

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