读取序列化对象时出现问题

时间:2014-04-07 21:01:07

标签: android serialization udp

我正在尝试创建一个客户端 - 服务器Android应用程序,我想在其中使用UDP协议传输文件。直到现在我能够传输文件并接收数据包的确认。

现在我想将序列号添加到数据包中的数据。我试图做以下事情:

  • 创建一个ByteArrayOutputStream。
  • 将其包装在ObjectOutputStream
  • 使用writeObject()
  • 将数据写入对象

序列化类包括:

public class Message implements Serializable {

private int seqNo;
private byte[] data;
private boolean ack;

public Message(int seqNo, byte[] data, boolean ack) {
    this.seqNo = seqNo;
    this.data = data;
    this.ack = ack;
}

客户端

byte[] fileBytes = new byte[500];
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(outStream);

while((numBytesRead = inputBuf.read(fileBytes)) != -1) {
//DatagramPacket packet = new DatagramPacket(fileBytes, fileBytes.length);
if (os == null) {
    os = new ObjectOutputStream(outStream);
}
        Message msg = new Message(++seqNo, fileBytes, false);   
    os.writeObject(msg);
    os.flush();
    os.reset();

    byte[] data = outStream.toByteArray();
    atagramPacket packet = new DatagramPacket(data, data.length);
    clientSocket.send(packet);
    }

服务器端

byte[] incomingData = new byte[1024];
while (true) {
try{
    DatagramPacket incomingPacket = new DatagramPacket(incomingData, incomingData.length);                                                      
        serverSocket.receive(incomingPacket);
    byte[] data = incomingPacket.getData();                 
    ByteArrayInputStream in = new ByteArrayInputStream(data);                             
        ObjectInputStream is = new ObjectInputStream(in);

    if (is == null) {
           is = new ObjectInputStream(in);
    }
    Message msg = (Message) is.readObject();
    System.out.println(msg.getSeqNo());
    out.write(msg.getData(),0,msg.getData().length);
      }

我面临的问题是

  1. 我收到每个数据包的相同序列号(即1)
  2. 我不确定传入数据包的缓冲区大小,因为我在客户端使用500字节而在使用1024时使用1024 Sever。如果我在两边都拿500字节,我会得到一个EOFexception。
  3. 如果你能提出更好的方法来实现同样的事情,我真的很感激!谢谢:))

1 个答案:

答案 0 :(得分:1)

  

消息msg =新消息(++ seqNo,fileBytes,false);

这里假设先前的read()填充了缓冲区。在文件结束之前的最后一次读取()它几乎肯定不会,并且它不能保证在任何时候填充它,只能传输至少一个字节。

你应该传递读数' numBytes'到这个构造函数,它应该创建一个这个大小的字节数组,并只复制那么多字节。

其他问题:

  • ' os'在你正在测试它时为空。
  • Ditto&#39; <#39;。
  • 您应该为每个数据报创建一个新的ObjectOutputStream和ByteArrayOutputStream。
  • Java数据报不断缩小到目前为止收到的最短数据报负载的大小。您必须为每次接收创建一个新的,或者至少在每次接收之前重置其长度。
  • 由于ObjectOutputStream开销,接收器需要更大的缓冲区。
  • 我不相信这段代码目前有效,更不用说你不断获得相同的序列号了。您更有可能获得相同的消息,,因为您在某处忽略了异常。