利用UDP网络编程传输对象

利用UDP网络编程传输对象

上篇写了一篇UDP的基本用法,这次来写一下UDP传输对象的使用

一:需要用的知识:

  1. java中io流
  2. java中的序列化
  3. UDP基本思想

二:常用的类

方法作用
Serializable对象必须实现这个接口才能序列化
ObjectOutputStreamwriteObject(),flush()对象输出流
ObjectInputStreamreadObject()对象输入流

三:代码示例

好了,话不多说直接上代码,这次代码总体比较简单也很好理解。

首先看下小编的代码结构图

在这里插入图片描述

代码案例如下

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这个流就无法发送消息给服务端,具体原因还不知道,有知道的可以和小编交流一下哈。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值