我有一个Java客户端服务器(使用ocsf,如果有人知道的话)我用来将文件从客户端上传到服务器。客户端实际上是一个Android应用程序(不确定在这种情况下这是否重要)
我这样做是通过读取文件数据(字节),将其包含在包含其他一些细节(用户ID等)的对象中,并通过ObjectOutputStream
将此对象发送到服务器。
看起来一切正常,直到文件的字节数组超过一定的大小(不确定这个奇怪的阈值是什么,但似乎645KB已经太多了)。然后,服务器在尝试从StreamCorruptedException
读取对象时抛出ObjectInputStream
并关闭套接字。
包含文件字节的对象消息的代码:
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();
答案 0 :(得分:1)
StreamCorruptedException
在反序列化数据时可以抛出Java StreamCorruptedException
。它主要发生在两个主要案例之一:
您尝试围绕一些未使用ObjectInputStream
实际编写的数据打开ObjectOutputStream
OR
在readObject()
操作期间,流进入“错误的位置”。
来自java docs:
当从对象流中读取的控制信息违反内部一致性检查时抛出。
但是我得到了这个带有大消息的异常并转移到了字节数组解决方案。
看一下这篇文章:http://www.javamex.com/tutorials/io/StreamCorruptedException.shtml
总之, 将对象转换为字节数组并从字节数组转换 。
答案 1 :(得分:0)
我最终做的是最初发送一个对象,指示上传详细信息(fileSize,sender id等),然后在服务器端抓取ObjectInputStream中的下划线inputStream并分别传输文件的字节。完成后,客户端和服务器继续通过对象进行通信。它现在工作正常。
希望这有助于某人。