我有一个Java客户端服务器(使用ocsf,如果有人知道)基础结构我正在使用上传文件从客户端到服务器。客户端实际上是一个Android应用程序(不知道在这种情况下是否重要)发送包含超过一定大小的字节数据的对象时发生Java StreamCorruptedException
我这样做是通过读取文件数据(字节),将其包含在包含一些其他细节的对象中(用户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;
}
客户端侧插座和溪流初始化:
output.writeObject(msg);
这些:
clientSocket= new Socket(host, port);
output = new ObjectOutputStream(clientSocket.getOutputStream());
input = new ObjectInputStream(clientSocket.getInputStream());
使用发送消息是服务器端的流初始化:
input = new ObjectInputStream(clientSocket.getInputStream());
output = new ObjectOutputStream(clientSocket.getOutputStream());
读取使用所述消息:
msg = input.readObject();
看看这个问题:http://stackoverflow.com/questions/33067125/error-when-attempting-to-send-kilobyte-message-over-tcp-in-java/33067409#33067409 –
@ravindra感谢您的答复。问题是我没有使用和不能使用DataOutputStream。我发送一个对象的原因(所以我可以发送上传细节连同数据)。你是说这不可能吗?如果是这样,我该如何关联这个元数据与文件数据本身?我想过使用一个单独的套接字,并使用它的DataStreams,但相关元数据的问题仍然存在... – Nom1fan
试试这种方法:http://stackoverflow.com/questions/31991831/why-cant-object-size-be-被测量的管理环境/ 31995411#31995411 –