利用UDP网络编程传输对象
上篇写了一篇UDP的基本用法,这次来写一下UDP传输对象的使用
一:需要用的知识:
- java中io流
- java中的序列化
- UDP基本思想
二:常用的类
类 | 方法 | 作用 |
---|---|---|
Serializable | 对象必须实现这个接口才能序列化 | |
ObjectOutputStream | writeObject(),flush() | 对象输出流 |
ObjectInputStream | readObject() | 对象输入流 |
三:代码示例
好了,话不多说直接上代码,这次代码总体比较简单也很好理解。
首先看下小编的代码结构图
代码案例如下
1 定义一个传输的对象Person类
public class Person implements Serializable {
private String name;
private Integer age ;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
2 定义UDP的client端
public class UdpClient {
public static void main(String[] args) throws IOException {
//创建udpsocket
DatagramSocket datagramSocket = new DatagramSocket();
//指定发送目的地址
InetAddress address = InetAddress.getLocalHost();
//指定发送的服务器端口
int port = 10000;
//person对象的实例化
Person person = new Person("小明", 25);
//单独抽取出来,是为了转化成字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//对象的输出流
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(baos));
//输出对象 序列化对象
oos.writeObject(person);
//数据缓冲区的刷新
oos.flush();
//转化成字节数组
byte[] sendBuff = baos.toByteArray();
System.out.println("消息发送中...");
System.out.println("发送的消息为: + " + person);
//向server发送对象
DatagramPacket dp = new DatagramPacket(sendBuff,sendBuff.length, address, port);
//调用发送方法
datagramSocket.send(dp);
System.out.println("person对象发送成功");
datagramSocket.close();
}
}
3 定义UDP的server端
public class UdpServer {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 创建udp scoket,创建端点,监听10000端口
DatagramSocket recviveSocket = new DatagramSocket(10000);
// 定义数据包用于存储数据
System.out.println("服务器已启动");
//接受消息的容器
byte[] contain = new byte[1024];
DatagramPacket recvivedp = new DatagramPacket(contain, contain.length);
// 阻塞并且解包
recviveSocket.receive(recvivedp);
byte[] data = recvivedp.getData();
int length = recvivedp.getLength();
ObjectInputStream ois =
new ObjectInputStream(
new BufferedInputStream(
new ByteArrayInputStream(data)));
Object obj = ois.readObject();
//反序列化
if ( obj instanceof Person) {
Person person = (Person) obj;
System.out.println("接受的person对象为: " + person);
}
recviveSocket.close();
}
}
输出结果如下:
clienet端
server端
注意事项
- 小编写这段demo的时候遇到了一个坑:如果没有加BufferedInputStream这个流就无法发送消息给服务端,具体原因还不知道,有知道的可以和小编交流一下哈。