发送包含超过一定大小的字节数据的对象时出现Java StreamCorruptedException

标签 java android sockets client

我有一个 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/

相关文章:

javascript - 使用 Javascript 格式化 HTML 字符串以正确显示

android - 线程实现

android - 创建在线游戏的最佳方法?

c# - 用于网络通信的良好 EOF 字节

java - 我的 Freemarker ObjectWrapper 如何访问模板设置

java - 监听器和计时器之间的通信

java - 使用 'where' 条件将值从一个表复制到另一个表

机器人 : post data to webview

android - 撇号前面没有\

javascript - NodeJS、SocketIO 和 Express 逻辑上下文构建