我们知道将对象序列化后,通过ObjectOutputStream和ObjectInputStream可以把对象写入文件或从文件中读取对象,最近遇到使用UDP协议发送对象的问题,下面说说UDP怎么发送对象。
UDP数据包DatagramPacker只能发送字节数组,那我们想办法把对象转化为字节数组,JAVA中的类ByteArrayInputStream和ByteArrayOutputStream与ObjectOutputStream和ObjectInputStream结合可以实现:
发送方:
public void send(Information info){
if(info == null) return;
DatagramSocket sendSocket = null;
ByteArrayOutputStream byteout = new ByteArrayOutputStream();//创建字节输出流
ObjectOutputStream oStream = null;
try {
sendSocket = new DatagramSocket();
oStream = new ObjectOutputStream(byteout);
oStream.writeObject(info.getInfoDataString());//将对象写入byte[]中
oStream.flush();
byte[] buf = byteout.toByteArray();
DatagramPacket datagramPacket = new DatagramPacket(buf,0,buf.length , info.getAddress().getDstIp(), info.getAddress().getPort());
sendSocket.send(datagramPacket);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if(byteout!=null)byteout.close();
if(oStream!=null) oStream.close();
if(sendSocket!=null) sendSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收方:
byte[] buf = new byte[1024*64];
DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);
receiveSocket.receive(receivePacket);
InetAddress hostInfo = receivePacket.getAddress();//发送方信息
//接收消息
bytein = new ByteArrayInputStream(receivePacket.getData());
inputStream = new ObjectInputStream(bytein);
TextAttribute textAttribute = (TextAttribute)inputStream.readObject();