2.2.3 使用UDP通信
UDP有不提供数据报分组、组装和不能对数据包排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用,包括网络视频会议系统在内的众多的客户端/服务器模式的网络应用都需要使用UDP协议。UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。UDP传输原理示意图如图2-6所示。

UDP服务器端工作的主要步骤如下。
步骤1 调用DatagramSocket(int port)创建一个数据报套接字,并绑定到指定端口上。
步骤2 调用DatagramPacket(byte[]buf,int length),建立一个字节数组以接收UDP包。
步骤3 调用DatagramSocket类的receive(),接受UDP包。
步骤4 关闭数据报套接字。
示例代码如下所示:
- // 接收的字节大小,客户端发送的数据不能超过MAX_UDP_DATAGRAM_LEN
- byte[] lMsg = new byte[MAX_UDP_DATAGRAM_LEN];
- // 实例化一个DatagramPacket类
- DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);
- // 新建一个DatagramSocket类
- DatagramSocket ds = null;
- try {
- // UDP服务器监听的端口
- ds = new DatagramSocket(UDP_SERVER_PORT);
- // 准备接收数据
- ds.receive(dp);
- } catch (SocketException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- // 如果ds对象不为空,则关闭ds对象
- if (ds != null) {
- ds.close();
- }
- }
UDP客户端工作的主要步骤如下。
步骤1 调用DatagramSocket()创建一个数据包套接字。
步骤2 调用DatagramPacket(byte[]buf,int offset,int length,InetAddress address,int port),建立要发送的UDP包。
步骤3 调用DatagramSocket类的send()发送UDP包。
步骤4 关闭数据报套接字。
示例代码如下所示:
- // 定义需要发送的信息
- String udpMsg = "hello world from UDP client " + UDP_SERVER_PORT;
- // 新建一个DatagramSocket对象
- DatagramSocket ds = null;
- try {
- // 初始化DatagramSocket对象
- ds = new DatagramSocket();
- // 初始化InetAddress对象
- InetAddress serverAddr = InetAddress.getByName("127.0.0.1");
- DatagramPacket dp;
- // 初始化DatagramPacket对象
- dp = new Datagram
- Packet(udpMsg.getBytes(), udpMsg.length(), serverAddr, UDP_SERVER_PORT);
- // 发送
- ds.send(dp);
- }
- // 异常处理
- // Socket连接异常
- catch (SocketException e) {
- e.printStackTrace();
- // 不能连接到主机
- }catch (UnknownHostException e) {
- e.printStackTrace();
- // 数据流异常
- } catch (IOException e) {
- e.printStackTrace();
- // 其他异常
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- // 如果DatagramSocket已经实例化,则需要将其关闭
- if (ds != null) {
- ds.close();
- }
- }
|