目录

UDP网络编程

基本介绍:

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

UDP网络编程原理示意图

alt UDP说明:

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

基本流程:

  1. 核心的两个类 DatagramSocket和DatagramPacket
  2. 建立发送端和接收端(没有服务端和客户端的概念)
  3. 发送数据前,建立数据包的对象
  4. 调用DatagramSocket的发送接收方法
  5. 关闭DatagramSocket

案例:通过UDP协议实现收发信息

接收端A代码实现


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UDPReceiverA {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象,准备在9999端口接收和发送数据
        DatagramSocket datagramSocket = new DatagramSocket(9999);
        byte[] bytes = new byte[1024];
        //创建数据报对象,将bytes数组传入,准备接收数据
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        System.out.println("等待发送数据...");
        //将接收到的数据放入数据报中,如果没有数据发过来,则阻塞,否则继续执行
        datagramSocket.receive(datagramPacket);
        //获取数据存入data数组
        byte[] data = datagramPacket.getData();
        //获取数据的长度
        int length = datagramPacket.getLength();
        //将数据放入字符串并显示
        String s = new String(data, 0, length);
        System.out.println(s);
        //将要发送的数据以byte数组形式存入
        byte[] bytes1 = "hi".getBytes(StandardCharsets.UTF_8);
        //放入数据报中
        DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes1.length, InetAddress.getByName("192.168.56.1"), 9998);
        //发送
        datagramSocket.send(datagramPacket1);
        System.out.println("发送了hi");
        //关闭资源
        datagramSocket.close();
        System.out.println("exit...");
    }
}

发送端B代码实现:

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class UDPSenderB {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象,准备在9998端口接收和发送数据
        DatagramSocket datagramSocket = new DatagramSocket(9998);
        //将数据存入byte数组中
        byte[] information = "hello".getBytes(StandardCharsets.UTF_8);
        //创建数据报对象,将放入数据,数据长度,接收端ip,接收端端口
        DatagramPacket datagramPacket = new DatagramPacket(information, information.length, InetAddress.getByName("192.168.56.1"), 9999);
        //发送数据
        datagramSocket.send(datagramPacket);
        System.out.println("发送了:hello");
        //接收数据,同UDPReceiverA类接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket1 = new DatagramPacket(bytes, bytes.length);
        datagramSocket.receive(datagramPacket1);
        int length = datagramPacket1.getLength();
        byte[] data = datagramPacket1.getData();
        String s = new String(data, 0, length);
        System.out.println(s);
        //关闭资源
        datagramSocket.close();
        System.out.println("exit...");
    }
}

结果:

  • 开启接收端A:
等待发送数据...
  • 开启发送端B:
    • 发送端B:
发送了:hello
hi
exit...
    • 接收端A:
等待发送数据...
hello
发送了hi
exit...