【发布时间】:2015-10-14 13:32:58
【问题描述】:
我有一个 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();
【问题讨论】:
-
@ravindra 感谢您的回复。问题是我没有使用也不能使用 DataOutputStream。我发送一个对象是有原因的(所以我可以将上传详细信息与数据一起发送)。你说这是不可能的吗?如果是这样,我如何将此元数据与文件数据本身相关联?我考虑过使用单独的套接字并在其上使用 DataStreams,但关联元数据的问题仍然存在......
-
我总是发送字节数组并重新构造它
-
所以你说的是基本上将 OutputStream 包装在 ByteArrayOutputStream 中,并用 ObjectOutputStream 包装所有这些>?如果是这样,我应该只在客户端还是在客户端和服务器端都这样做?
标签: java android sockets client