UDP网络编程

本文深入探讨了UDP协议的特性,包括其不可靠性以及数据报的发送与接收过程。通过具体的Java代码示例,展示了如何使用DatagramSocket和DatagramPacket进行数据传输,对比了UDP与TCP的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
用的仍然是Socket,只不过是DatagramSocket,接收端和发送端都用的是这个
数据包:又叫数据报 DatagramPacket ,里面封装了具体的数据
习惯上叫做发送端(Sender)和接收端(Receiver)
按道理应该先启动接收端,如果我们先启动的是Sender,也没有报错(因为UDP只管发,不管有没有接收到),再去启动接收端,接收肯定接收不到了,因为Sender已经关闭,但并没有报异常。如果是TCP,先启动Cilent(发送端)会报异常

public class test {

    @Test
    public void Sender(){
        DatagramSocket socket = null;//不要用参数,数据从哪里来,到哪里去都不会放在socket中了,而是放在数据报中
        try {
            socket = new DatagramSocket();

            String str="采用UDP方式发送的数据";
            byte[] bytes = str.getBytes();

            //指定对方的IP地址
            InetAddress inet = InetAddress.getByName("127.0.0.1");//或者写成InetAddress.getLocalHost(),反正这是传给自己

            //对方的端口号指定为9090
            //封装数据报
            DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,inet,9090);//数据都封装在它里面


            //通过socket把数据报发出去
            socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(socket!=null){
                socket.close();
            }
        }
    }

    @Test
    public void Receiver(){

        DatagramSocket socket= null;//指明自己的端口号
        try {
            socket = new DatagramSocket(9090);

            byte[] bytes=new byte[100];

            //把数据存到packet当中
            DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length);//因为不是发送端,所以不要指定端口号和IP地址
            //用socket去接收数据,接收到DatagramPacket当中
            socket.receive(packet);

            //数据本质上是在bytes当中的,下面把数据展示到控制台上
            //如果这么做并不好写
            //String str=new String(bytes,0,);从0开始,一直到写进去了多少个,第三个参数不好写,不知道有多少个
            System.out.println(new String(packet.getData(),0,packet.getLength()));//packet.getData()是获取packet中的数据,是一个字节数组。相当于是bytes,packet.getLenth()得到写到bytes数组中多少个
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(socket!=null)
                socket.close();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值