Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过套接字发送对象内部的文件字节_Java_Sockets_Tcp - Fatal编程技术网

Java 通过套接字发送对象内部的文件字节

Java 通过套接字发送对象内部的文件字节,java,sockets,tcp,Java,Sockets,Tcp,几天来,我一直在努力让它工作,但没有成功 我想通过套接字客户端/服务器发送一个文件。唯一的区别是:我想发送一个包含文件字节的对象 因此,客户端加载一个文件,读取1024字节的块,将它们存储在一个对象中,然后将对象发送到服务器。由于文件可以大于1024字节,所以我希望重复发送对象,但其中存储的字节不同(缓冲区读取时)。在服务器上,我想组成字节数组并将其保存为文件 我之所以使用1024,是因为我想避免任何类型的内存不足错误,比如说,如果文件大小为4GB 我尝试在客户端上执行以下操作: File fi

几天来,我一直在努力让它工作,但没有成功

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

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

我之所以使用1024,是因为我想避免任何类型的内存不足错误,比如说,如果文件大小为4GB

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

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试图保留对象标识的效果。重复写入同一对象实例将导致接收方端的同一实例。这通常是一件好事,但如果您正在修改发送方端的对象,并希望这些修改显示在接收方端,则会令人困惑

因此,您有两个问题:

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

  • 您的对象是否实现了可序列化?永远不要放弃
    bis.read(bytes)
    实际读取的字节数,因为在套接字上读取的字节数很可能小于完整字节数。如果一次读取大量字节,则不需要缓冲流。+1您可以使用
    .reset()
    .writeUnshared(ft)read()
    method.bos.write(ft.getBytes(),0,ft.getCount())返回的值;没有工作,您能解释一下如何完成吗?我只是检查了一下,服务器和以前一样接收sames字节,即使客户端正在发送新字节并在循环中实例化一个新对象。如何确保接收到不同的字节?