gpt4 book ai didi

java - Java中的文件传输和对象序列化

转载 作者:行者123 更新时间:2023-12-02 00:22:00 27 4
gpt4 key购买 nike

我正在开发一个客户端/服务器聊天应用程序,该应用程序允许用户通过套接字连接发送文件(图像/视频...)。

为了管理所有类型的通信,我使用一个对象“数据包”来存储我想要发送的所有信息。 (发送者、接收者、文件...)。

这是我在流中编写的代码示例:

private void write(Packet packet) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(bos);
os.writeObject(packet);
this.outStream.write(bos.toByteArray());
}

outStream 是一个输出流。

这是我的连接运行:

public void run() {
while (isRunning()) {
try {
byte[] buffer = new byte[65536];
// Read from the InputStream
inStream.read(buffer);
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buffer));
Packet p = (Packet) in.readObject();

} catch (IOException e) {
e.printStackTrace();
this.disconnect();
}
}
}

除了文件传输之外,它适用于所有用途!我将文件放入 byte[] (带有文件流)并将数组存储在我的数据包对象中。当服务器收到通信时,它会在“in.readObject()”上中断,并给我一个漂亮的“java iostreamcorruptedException错误格式:0”异常。

我尝试使用自定义 byte[](由 string.getBytes() 填充)进行传输,效果非常好。

那么,我做错了什么?

最佳答案

您正在从 InputStream 读取字节数组(具有任意大小,可能太小)。然后构造一个 ObjectInputStream 来从此字节数组中读取。为什么不直接从 InputStream 读取对象?

ObjectInputStream in = new ObjectInputStream(inStream);
Packet p = (Packet) in.readObject();

不需要缓冲区。

此外,InputStream.read() 不会从InputStream 中读取所有内容。它读取可用的内容,并返回读取的字节数。如果不循环直到返回-1,则只能读取另一端发送的部分内容。

顺便说一句,您在发送方犯了同样的错误。您不是将对象直接写入输出流,而是将其写入字节数组,然后发送该字节数组。将对象直接写入流:

ObjectOutputStream os = new ObjectOutputStream(this.outputStream);
os.writeObject(packet);

不需要缓冲区。

关于java - Java中的文件传输和对象序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10769730/

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