目录

1、UDP 的定义

2、UDP 编程的两个实现类

3、UDP 编程实现发送端和接收端相互通信(模拟QQ)


1、UDP 的定义

提供面向事务的简单不可靠信息传送服务。Java 主要提供了两个类来实现基于 UDP 的 Socket 编程。

2、UDP 编程的两个实现类

DatagramSocket.class:此类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点,每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。在 DatagramSocket 上总是启用 UDP 广播发送。

DatagramPacket.class:此类表示数据报包,它用来实现无连接的包投递服务。DatagramPacket 会根据该包中包含的地址和端口等信息,将报文从一台机器路由到另一台机器。

        DatagramPacket 类主要有两个构造函数:

  1. 一个用来接收数据
  2. 另一个用来发送数据 DatagramPacket(byte buf[], int length, InetAddress address, int port),建立将要传输的 UDP 包,并指定 ip 地址和端口号。

3、UDP 编程实现发送端和接收端相互通信(模拟QQ)

        接收端代码的具体实现:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class UdpRecv {

    /**
     * 中断标记
     */
    public static final String QUIT = "quit";

    public static void main(String[] args) throws Exception {
        // 创建套接字
        DatagramSocket ds = new DatagramSocket(3000);
        byte[] buf = new byte[1024];
        while (true) {
            // 创建接收消息数据包
            DatagramPacket recive = new DatagramPacket(buf, 1024);
            // 接收消息,如果没有消息,进入阻塞状态
            ds.receive(recive);
            String strRecv = new String(recive.getData(), 0, recive.getLength()) +
                    " from " + recive.getAddress().getHostAddress() + ":" + recive.getPort();
            // 打印接收到的消息
            System.out.println(strRecv);

            System.out.println("请输入:");
            Scanner sc = new Scanner(System.in);
            String next = sc.next();
            if (next.equals(QUIT)) {
                ds.close();
                System.out.println("程序退出...");
                break;
            }

            // 创建发送消息数据包
            DatagramPacket send = new DatagramPacket(next.getBytes(), next.length(),
                    InetAddress.getByName("127.0.0.1"), recive.getPort());
            // 发送消息
            ds.send(send);
            System.out.println("消息已经发送...");
        }
    }
}

        发送端的具体代码实现:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class UdpSend {

    public static final String QUIT = "quit";

    public static void main(String[] args) throws Exception {
        DatagramSocket ds = new DatagramSocket();
        byte[] buf = new byte[1024];
        
        while (true) {
            System.out.println("请输入:");
            Scanner sc = new Scanner(System.in);
            String next = sc.next();
            if (next.equals(QUIT)) {
                // 发送通知退出消息
                DatagramPacket send = new DatagramPacket(next.getBytes(), next.length(),
                        InetAddress.getByName("127.0.0.1"), 3000);
                ds.send(send);
                ds.close();
                System.out.println("程序退出...");
                break;
            }
            // 发送消息数据包
            DatagramPacket send = new DatagramPacket(next.getBytes(), next.length(),
                    InetAddress.getByName("127.0.0.1"), 3000);
            // 发送消息
            ds.send(send);
            System.out.println("消息已经发送...");

            // 接收消息数据包
            DatagramPacket recive = new DatagramPacket(buf, 1024);
            // 接收消息
            ds.receive(recive);
            String strRecv = new String(recive.getData(), 0, recive.getLength()) +
                    " from " + send.getAddress().getHostAddress() + ":" + recive.getPort();
            System.out.println(strRecv);
        }
    }
}

        分别单独运行以上程序,通信效果演示如下,发送端消息:

用java编写的udp java基于udp的socket编程_UDP

        接收端消息:

用java编写的udp java基于udp的socket编程_用java编写的udp_02

        至此基于 UDP 的 socket 编程的简要介绍结束。