2015-10-14 45 views
1

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

看看这个问题:http://stackoverflow.com/questions/33067125/error-when-attempting-to-send-kilobyte-message-over-tcp-in-java/33067409#33067409 –

+0

@ravindra感谢您的答复。问题是我没有使用和不能使用DataOutputStream。我发送一个对象的原因(所以我可以发送上传细节连同数据)。你是说这不可能吗?如果是这样,我该如何关联这个元数据与文件数据本身?我想过使用一个单独的套接字,并使用它的DataStreams,但相关元数据的问题仍然存在... – Nom1fan

+0

试试这种方法:http://stackoverflow.com/questions/31991831/why-cant-object-size-be-被测量的管理环境/ 31995411#31995411 –

回答

1
StreamCorruptedException 

一个Java StreamCorruptedException可以同时deserialising数据被抛出。它在本质上发生在两种主要情况之一:

您尝试打开一个ObjectInputStream周围实际上并没有使用ObjectOutputStream

OR

在一个readObject()操作,流获取写了一些数据“错误的地方”。

java docs

时从对象流中读取控制信息违反内部一致性检查抛出。

但我得到了这个异常与大消息,并转移到字节数组解决方案。

看一看这篇文章:http://www.javamex.com/tutorials/io/StreamCorruptedException.shtml

综上所述,转换对象,并从字节数组,并重新创建

+0

刚刚从这一发现的解释:http://stackoverflow.com/questions/2393179/streamcorruptedexception-invalid-type-code-ac –

+0

感谢您的帮助!我真的想采用你的解决方案。我的问题是我觉得某些东西仍然不是最佳实践,因为我认为您应该始终能够向用户显示文件上传的进度条,并且只需将整个对象与文件数据字节数组一起转换并发送批量不允许。仍然觉得我失去了一些东西。 – Nom1fan

+0

我仍然认为您可以根据字节数组大小显示进度条。字节[]到对象的转换可能不会更长,但下载字节数组需要时间。 –

0

我最终做了什么最初是发送一个对象,指示上传细节(fileSize,sender id等),然后在服务器端抓住了ObjectInputStream中的下划线inputStream,并且只传输了文件的字节分别。一旦完成,客户端和服务器继续通过对象进行通信。它现在工作正常。

希望这可以帮助别人。