当发送包含超过一定大小字节数据的对象时,安卓 Java StreamCorruptedException
我有一个Java客户机服务器(如果这里有人知道的话,可以使用ocsf)基础设施,用于将文件从客户机上传到服务器。该客户端实际上是一个Android应用程序(不确定这在本例中是否重要)
我通过读取文件数据(字节),将其包装在包含其他一些细节(用户id等)的对象中来实现这一点并通过ObjectOutputStream
将该对象发送到服务器
在文件的字节数组超过一定大小之前,似乎一切都正常(还不确定这个奇怪的阈值是什么,但似乎645KB已经太大了)。然后,服务器在试图从ObjectInputStream
读取对象时抛出StreamCorruptedException
,并关闭socket
包含文件字节的对象消息的代码:
public class MessageUploadFile extends MessageToServer {
private static final long serialVersionUID = 2356276507283427913L;
private String _destId;
private TransferDetails _td;
private byte[] _fileData;
public MessageUploadFile(String srcId, TransferDetails td, byte[] fileData){
super(srcId);
_destId = td.getDestinationId();
_td = td;
_fileData = fileData;
}
客户端socket和流初始化:
clientSocket= new Socket(host, port);
output = new ObjectOutputStream(clientSocket.getOutputStream());
input = new ObjectInputStream(clientSocket.getInputStream());
使用以下命令发送消息:
output.writeObject(msg);
以下是服务器端的流初始化:
input = new ObjectInputStream(clientSocket.getInputStream());
output = new ObjectOutputStream(clientSocket.getOutputStream());
使用以下命令阅读信息:
msg = input.readObject();
# 1 楼答案
反序列化数据时可以抛出Java
StreamCorruptedException
。它主要发生在以下两种情况之一:您试图在一些数据周围打开一个
ObjectInputStream
,这些数据实际上不是用ObjectOutputStream
写的或者
在
readObject()
操作期间,流进入了“错误的位置”从java docs
但我得到了一个大消息的例外,并转移到字节数组解决方案
看看这篇文章:http://www.javamex.com/tutorials/io/StreamCorruptedException.shtml
总之,将对象与字节数组进行转换,并重新创建它
# 2 楼答案
我最终做的是最初发送一个对象,指示上传细节(文件大小、发件人id等)然后在服务器端抓取ObjectInputStream中的下划线inputStream,并单独传输文件的字节。一旦完成,客户端和服务器将继续通过对象进行通信。现在还可以
希望这对别人有帮助