我正在开发一个客户端/服务器聊天应用程序,它允许用户通过套接字连接发送文件(图像/视频......)。
为了管理所有类型的通信,我使用一个Object“Packet”来存储我想要发送的所有信息。 (发件人,收件人,档案......)。
以下是我在流中编写的代码示例:
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是一个OutputStream。
这是我的连线运行:
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 [](带文件流)中,并将数组存储在我的Packet Object中。 当服务器收到通信时,它会在“in.readObject()”中断开,并给我一个漂亮的“java io streamcorruptedexception错误格式:0”异常。
我尝试使用自定义byte []进行传输(由string.getBytes()填充)并且效果非常好。
那么,我做错了什么?
答案 0 :(得分:3)
您正在从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);
不需要缓冲区。