我有一个 Java 客户端-服务器(如果这里有人知道的话,可以使用 ocsf)基础设施,我用它来将文件从客户端上传到服务器。客户端实际上是一个 Android 应用程序(不确定在这种情况下是否那么重要)
我这样做是通过读取文件数据(字节),将其包装在一个包含一些其他详细信息(用户 ID 等)的对象中,然后通过 ObjectOutputStream
将此对象发送到服务器.
似乎一切正常,直到文件的字节数组超过一定大小(不确定这个奇怪的阈值是多少,但看起来 645KB 已经太多了)。然后,服务器在尝试从 ObjectInputStream
读取对象时抛出 StreamCorruptedException
并关闭套接字。
包含文件字节的对象消息代码:
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;
}
客户端套接字和流初始化:
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();
最佳答案
StreamCorruptedException
反序列化数据时可能会抛出 Java StreamCorruptedException
。它基本上发生在两种主要情况之一:
您尝试打开一个 ObjectInputStream
围绕一些实际上不是使用 ObjectOutputStream
写入的数据
或
在 readObject()
操作期间,流进入“错误的位置”。
来自 java docs :
Thrown when control information that was read from an object stream violates internal consistency checks.
但是我得到了这个带有大消息的异常并转移到字节数组解决方案。
看看这篇文章:http://www.javamex.com/tutorials/io/StreamCorruptedException.shtml
总而言之,将对象与字节数组相互转换并重新创建它。
关于发送包含超过一定大小的字节数据的对象时出现Java StreamCorruptedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33126800/