Java 通过套接字发送对象内部的文件字节
几天来,我一直在努力让它工作,但没有成功 我想通过套接字客户端/服务器发送一个文件。唯一的区别是:我想发送一个包含文件字节的对象 因此,客户端加载一个文件,读取1024字节的块,将它们存储在一个对象中,然后将对象发送到服务器。由于文件可以大于1024字节,所以我希望重复发送对象,但其中存储的字节不同(缓冲区读取时)。在服务器上,我想组成字节数组并将其保存为文件 我之所以使用1024,是因为我想避免任何类型的内存不足错误,比如说,如果文件大小为4GB 我尝试在客户端上执行以下操作:Java 通过套接字发送对象内部的文件字节,java,sockets,tcp,Java,Sockets,Tcp,几天来,我一直在努力让它工作,但没有成功 我想通过套接字客户端/服务器发送一个文件。唯一的区别是:我想发送一个包含文件字节的对象 因此,客户端加载一个文件,读取1024字节的块,将它们存储在一个对象中,然后将对象发送到服务器。由于文件可以大于1024字节,所以我希望重复发送对象,但其中存储的字节不同(缓冲区读取时)。在服务器上,我想组成字节数组并将其保存为文件 我之所以使用1024,是因为我想避免任何类型的内存不足错误,比如说,如果文件大小为4GB 我尝试在客户端上执行以下操作: File fi
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个字节重复两次。此外,在服务器中接收时,counttest整数从不增加
你知道如何做到这一点吗
提前感谢。您遇到了ObjectOutputStream试图保留对象标识的效果。重复写入同一对象实例将导致接收方端的同一实例。这通常是一件好事,但如果您正在修改发送方端的对象,并希望这些修改显示在接收方端,则会令人困惑 因此,您有两个问题:
writeUnshared()
方法李>
reset()
ObjectOutputStream,以防止所有这些实例被永久保留(并可能导致客户端或服务器上出现OOME)您的对象是否实现了可序列化?永远不要放弃
bis.read(bytes)
实际读取的字节数,因为在套接字上读取的字节数很可能小于完整字节数。如果一次读取大量字节,则不需要缓冲流。+1您可以使用.reset()
或.writeUnshared(ft)然而,为了避免这种情况,我将完全避免使用ObjectOutputStream。我将使用DataOutputStream,这将更有效,但也更简单。但是,输出文件的前1024字节仍重复两次(原始文件为2K)。知道如何解决这个问题吗?@rodd-除其他外,您需要考虑read()
method.bos.write(ft.getBytes(),0,ft.getCount())返回的值;没有工作,您能解释一下如何完成吗?我只是检查了一下,服务器和以前一样接收sames字节,即使客户端正在发送新字节并在循环中实例化一个新对象。如何确保接收到不同的字节?