【发布时间】:2014-04-07 21:01:06
【问题描述】:
我正在尝试创建一个客户端-服务器 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)
- 我不确定传入数据包的缓冲区大小,因为我在客户端使用 500 字节,在
使用 1024 服务器。如果我在两边都取 500 个字节,我会得到一个 EOFexception。
如果您能提出更好的方法来实现同样的事情,我将不胜感激!谢谢:)
【问题讨论】:
标签: android serialization udp