发送包含特定大小的字节数据的对象时发生Java StreamCorruptedException

时间:2015-10-14 13:32:58

标签: java android sockets client

我有一个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();

2 个答案:

答案 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并分别传输文件的字节。完成后,客户端和服务器继续通过对象进行通信。它现在工作正常。

希望这有助于某人。