UDP通信那些知识,你了解吗?

# UDP通信程序

UDP通信原理

  • UDP协议是一种不可靠的网络协议,在通信两端各建立一个Socket对象,但是这两个Socket对象只是发送,接受数据的对象,因此对于基于UDP协议通信双方而言,没有所谓的客户端,服务端的概念
  • Java提供了DatagramSocket类作为基于UDP协议的Socket

UDP发送数据

  1. 创建发送端的Socket对象(DatagramSocket)
  2. 创建数据,并打包数据
  3. 调用DatagramSocket对象方法发送数据
  4. 关闭发送端
        DatagramSocket ds = new DatagramSocket();//创建发送端对象
        byte[] bytes="Hello,udp,俺老孙来也".getBytes();
		//创建数据并打包数据  最后这个10086参数是端口号范围0~65535
DatagramPacket dp = new DatagramPacket(bytes, bytes.length,InetAddress.getByName("10.5.219.110"), 10086);
        ds.send(dp);//调用发送对象的方法
        ds.close();//关闭发送端

UDP接收数据

  1. 创建接收端的Socket对象(DatagramSocket)
  2. 创建一个数据包,用于接收数据
  3. 调用DatagramSocket方法用于接收数据
  4. 解析数据包,并把数据在控制台上显示
  5. 关闭接收端
        DatagramSocket ds = new DatagramSocket(10086);//这里是带参,要输入和发送端一样的端口号
        byte[] bytes = new byte[1024];
		//创建数据包,用于接收数据,在接受的时候只需要两个参数,字节数组和字节数组的长度
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
        ds.receive(dp);//调用Socket接收方法
		//这里dp.getLength()是实际接收的长度,创建一个String对象,传入Byte[]数组,可以自动转化为字符串
        System.out.println(new String(dp.getData(),0,dp.getLength()));
        ds.close();//最后不要忘记关闭接收端

UDP通信程序联系小案例

题目需求

  • UDP发送数据,数据来源于键盘的输入,直到输入886,发送数据结束
  • UDP接收数据,因为接收端不知道发送端什么时候停止发送,故采用死循环

发送端源码

public class InetAddressDemo {
    public static void main(String[] args) throws IOException {

        DatagramSocket ds = new DatagramSocket();
        
        //自己封装键盘录入信息       
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line=bf.readLine())!=null){
            if("886".equals(line)){
                break;
            }

            byte[] bytes = line.getBytes();
            DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("10.5.219.110"),12345);
            ds.send(dp);
        }
        ds.close();
    }
}

接收端源码

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(12345);//创建Socket对象的时候要带有端口号参数
        while (true){
            byte[] bytes=new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
            ds.receive(dp);
            System.out.println("接收的数据为 :"+new String(dp.getData(),0,dp.getLength()));
        }
    }
    //因为不知道发送端什么时候停止,所以这里采用死循环,就不用close()接收端了
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_x_330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值