有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当发送包含超过一定大小字节数据的对象时,安卓 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();

共 (2) 个答案

  1. # 1 楼答案

    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

    总之,将对象与字节数组进行转换,并重新创建它

  2. # 2 楼答案

    我最终做的是最初发送一个对象,指示上传细节(文件大小、发件人id等)然后在服务器端抓取ObjectInputStream中的下划线inputStream,并单独传输文件的字节。一旦完成,客户端和服务器将继续通过对象进行通信。现在还可以

    希望这对别人有帮助