Java
Python前端运维数据库
Java
Java
  • 新特性
    • Record
    • Optional
  • 面向对象
    • 面向对象基础
    • 构造方法
    • 继承与多态
    • 接口
    • 修饰符
    • 代码块
    • 接口(Interface)
    • 枚举类
  • IO流
    • IO
      • 字节流
      • 字符流
      • 缓冲流
      • 转换流
      • 操作ZIP
      • File 对象
    • NIO
      • Channel和Buffer
      • 异步文件通道AsynchronousFileChannel
      • Selector
      • Path/Files/Pipe
  • 反射
  • 内存分配
  • 集合
    • 简介
    • List
    • Set
    • Map
    • EnumMap
  • 日期与时间
    • Date和Calendar
    • Java8 新时间 ✨
      • LocalDateTime
      • ZonedDateTime
      • Duration
    • 时间格式化
      • SimpleDateFromat
      • DateTimeFormatter ✨
    • Instant
    • 实践
  • 网络编程
    • IP 地址
    • 网络模型
    • TCP 编程
    • UDP 编程
    • HTTP 编程
  • 加密和安全
  • 并发编程
    • 多线程
    • 线程与进程的区别
    • 线程组和线程优先级
    • 线程池
    • 线程锁
  • 异步任务
    • Future
    • CompletableFuture
      • 开启异步任务
      • 串行任务方法
      • 并行任务方法
      • 任务结束方法
      • 异常处理方法
      • 查看状态方法
      • 设置任务结果方法
  • 执行系统命令
  • Stream 流
    • Stream 流的创建
    • Stream 流串行与并行
    • Stream 流中间操作
    • Stream 流终端操作
  • Lambda 表达式
    • Lambda 表达式简介
    • Lambda 表达式语法
    • 方法引用
  • String
  • StringBuffer
由 GitBook 提供支持
在本页

这有帮助吗?

  1. 网络编程

UDP 编程

jUDP 协议是一种对等通信的实现,发送方之需要接受方的 IP 和 Port,就可以直接向它发送数据,不需要先连接。UDP 是一种无连接的传输协议,每个数据报的大小限制在 64KB 内。数据报是一个在网络上发送的独立信息,它到达时间以及内容本身都不能得到保证。这种传输方式是无需的,也不能确保绝对的安全可靠,但它很简单也具有较高的效率。

使用 UDP 协议进行数据传输,需要将传输数据定义为数据报(DatagramPaket),在数据报中指明所需要到达 Socket(主机地址和端口号),然后再将数据报发送出去。

实例化 DatagramPacket 时使用参数 port 和没有 port 参数的区别在于,提供 port 的一方可以让别人主动发送消息过来,而没有 Port 参数则会在发送消息时自动绑定一个本地没有使用的端口。在接收到发送的数据报时,不仅可以获取数据,还可以获取发送方的 IP 和 Port,这样就可以向发送方发送数据。

// 创建一个缓冲区
byte[] sendMsgBytes = "Hello World!".getBytes();
// 创建发送端 Socket 对象
try (DatagramSocket sendSocket = new DatagramSocket();) {
    // 获取本机通信地址
    InetAddress address = InetAddress.getLocalHost();
    // 打包数据
    DatagramPacket sendPacket = new DatagramPacket(sendMsgBytes, 0, sendMsgBytes.length, address, 8080);
    // 发送数据
    sendSocket.send(sendPacket);
    // 发送端等待接收端接收成功后的回应
    // 创建一个缓冲区,容量尽量设置大一点因为不知道发送过来的信息有多大
    byte[] receiveByte = new byte[1024 * 1024];
    // 接受数据报
    DatagramPacket receivePacket = new DatagramPacket(receiveByte, 0, receiveByte.length);
    // 接收数据
    sendSocket.receive(receivePacket);
    // 获取接收端发送过来的真实长度以及数据
    byte[] data = receivePacket.getData();
    int dateLen = receivePacket.getLength();
    String receiveMessage = new String(data, 0, dateLen);
    // 获取发送者的IP
    System.out.println("接收来自 " + receivePacket.getAddress().getHostAddress() + " 的消息:" + receiveMessage);
} catch (IOException e) {
    throw new RuntimeException(e);
}
try (DatagramSocket receiveSocket = new DatagramSocket(8080)) {
    // 设置缓冲区接收发过来的信息
    byte[] receiveBytes = new byte[1024 * 1024];
    // 接收数据报
    DatagramPacket receivePacket = new DatagramPacket(receiveBytes, 0, receiveBytes.length);
    // 接收数据
    receiveSocket.receive(receivePacket);
    byte[] data = receivePacket.getData();
    int dateLen = receivePacket.getLength();
    String receiveMessage = new String(data);
    System.out.println("接收到来自 " + receivePacket.getAddress().getHostAddress() + " 的消息:" + receiveMessage);
    // 接收端接收到信息后发送一条确认接收的消息到发送端
    String message = "OK,数据我已经接收并处理了";
    byte[] messageByte = message.getBytes();
    //构造新数据报
    DatagramPacket sendPacket = new DatagramPacket(messageByte, messageByte.length, receivePacket.getAddress(), receivePacket.getPort());
    // 发送数据
    receiveSocket.send(sendPacket);
    // 关闭资源
} catch (IOException e) {
    throw new RuntimeException(e);
}

上一页TCP 编程下一页HTTP 编程

最后更新于3个月前

这有帮助吗?