网络编程 p5 UDP编程

[复制链接]
发表于 2023-7-20 16:02:05 | 显示全部楼层 |阅读模式
UDP网络通信编程


  • 基本介绍

    • 类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序。
    • UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
    • DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
    • UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接送方的连接。

  • 基本流程

    • 核心的两个类/对象 DatagramSocket/DatagramPacket
    • 建立发送端,接收端
    • 建立数据包
    • 调用DatagramSocket的发送和接收方法
    • 关闭DatagramSocket


  • UDP网络编程原理示意图

  • 注意事项

    • 没有明确的服务端和客户端,演变成数据的发送端和接收端;
    • 接收数据和发送数据是通过DatagramSocket对象完成的;
    • 将数据封装到DatagramPacket对象/装包;
    • 当接收到DatagramPacket对象,需要进行拆包,取出数据;
    • DatagramSocket可以指定在哪个端口接收数据;

  • 代码演示
    1. package com.hspedu.udp;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.DatagramSocket;
    5. import java.net.InetAddress;
    6. /**
    7. * @author: 86199
    8. * @date: 2023/5/17 17:49
    9. * @description: UDP
    10. */
    11. public class UDPReceiverA {
    12.     public static void main(String[] args) throws IOException {
    13.         //1. 创建一个DatagramSocket 对象,准备在9999接收数据
    14.         DatagramSocket socket = new DatagramSocket(9999);
    15.         //2. 构建一个DatagramPacket对象,用来接收数据
    16.         //    UDP,一个数据包最大64K
    17.         byte[] bytes = new byte[1024];
    18.         DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
    19.         //3. 调用接受方法,将通过网络传输的 DatagramPacket 对象填充到packet对象
    20.         //   注意:当有数据发送到 本机的9999端口时,就会接收到数据
    21.         //        如果没有数据包发送到 本机的9999端口,就会阻塞等待
    22.         System.out.println("接收端A 等待接收数据……");
    23.         socket.receive(packet);
    24.         int length = packet.getLength();
    25.         byte[] data = packet.getData();
    26.         String s = new String(data, 0, length);
    27.         System.out.println(s);
    28.         //a端作发送端
    29.         byte[] data2 = "好的,明天见".getBytes();
    30.         DatagramPacket packet1 =
    31.                 new DatagramPacket(data2, data2.length, InetAddress.getByName("10.15.205.153"), 9998);
    32.         socket.send(packet1);
    33.         //关闭资源
    34.         socket.close();
    35.         System.out.println("A端退出...");
    36.     }
    37. }
    复制代码
    1. package com.hspedu.udp;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.DatagramSocket;
    5. import java.net.InetAddress;
    6. /**
    7. * @author: 86199
    8. * @date: 2023/5/17 17:50
    9. * @description: UDP
    10. */
    11. public class UDPSenderB {
    12.     public static void main(String[] args) throws IOException {
    13.         //1. 创建 DatagramSocket 对象,准备在9998端口 发送数据
    14.         DatagramSocket socket = new DatagramSocket(9998);
    15.         //2. 将需要发送的数据,封装到 DatagramPacket对象
    16.         byte[] data = "hello,明天去吃火锅吧".getBytes();
    17.         //说明:封装 DatagramPacket对象 data 内容字节数组,data.length,主机(IP),端口
    18.         DatagramPacket packet =
    19.                 new DatagramPacket(data, data.length, InetAddress.getByName("10.15.205.153"), 9999);
    20.         socket.send(packet);
    21.         //B端作接收端
    22.         byte[] bytes = new byte[1024];
    23.         DatagramPacket packet1 = new DatagramPacket(bytes, bytes.length);
    24.         System.out.println("接收端B 等待接收数据……");
    25.         socket.receive(packet1);
    26.         int length = packet1.getLength();
    27.         byte[] data1 = packet1.getData();
    28.         String s = new String(data1, 0, length);
    29.         System.out.println(s);
    30.         //关闭资源
    31.         socket.close();
    32.         System.out.println("B端退出...");
    33.     }
    34. }
    复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表