我正在尝试创建一个客户端 - 服务器Android应用程序,我想在其中使用UDP协议传输文件。直到现在我能够传输文件并接收数据包的确认。
现在我想将序列号添加到数据包中的数据。我试图做以下事情:
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);
}
我面临的问题是
如果你能提出更好的方法来实现同样的事情,我真的很感激!谢谢:))
答案 0 :(得分:1)
消息msg =新消息(++ seqNo,fileBytes,false);
这里假设先前的read()填充了缓冲区。在文件结束之前的最后一次读取()它几乎肯定不会,并且它不能保证在任何时候填充它,只能传输至少一个字节。
你应该传递读数' numBytes'到这个构造函数,它应该创建一个这个大小的字节数组,并只复制那么多字节。
其他问题: