background image

在 Java 中控制 UDP 协议

什么是 UDP 协议
  UDP 协议的全称是用户数据报,在网络中它与 TCP 协议一样用于处理数据包。在
OSI

——

模型中,在第四层

传输层,处于 IP 协议的上一层。UDP 有不提供数据报分组、组

装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全
完整到达的。
  为什么要使用 UDP
  在选择使用协议的时候,选择 UDP 必须要谨慎。在网络质量令人不十分满意的环境
下,UDP 协议数据包丢失会比较严重。但是由于 UDP 的特性:它不属于连接型协议,因
而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用
UDP 较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比
如我们聊天用的 ICQ 和 OICQ 就是使用的 UDP 协议。
  在 Java 中操纵 UDP
  使用位于 JDK 中 Java.net 包下的 DatagramSocket 和 DatagramPacket 类,可以
非常方便地控制用户数据报文。
  在描述它们之前,必须了解位于同一个位置的 InetAddress 类。InetAddress 实现
了 Java.io. Serializable 接口,不允许继承。它用于描述和包装一个 Internet IP 地址,
通过三个方法返回 InetAddress 实例:
  getLocalhost():返回封装本地地址的实例。
  getAllByName(String host):返回封装 Host 地址的 InetAddress 实例数组。
  getByName(String host):返回一个封装 Host 地址的实例。其中,Host 可以是域
名或者是一个合法的 IP 地址。
  DatagramSocket 类用于创建接收和发送 UDP 的 Socket 实例。和 Socket 类依赖
SocketImpl 类 一 样 , DatagramSocket 类 的 实 现 也 依 靠 专 门 为 它 设 计 的
DatagramScoketImplFactory 类。DatagramSocket 类有 3 个构建器:
  DatagramSocket():创建实例。这是个比较特殊的用法,通常用于客户端编程,它
并没有特定监听的端口,仅仅使用一个临时的。
  DatagramSocket(int port):创建实例,并固定监听 Port 端口的报文。
  DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,
当一台机器拥有多于一个 IP 地址的时候,由它创建的实例仅仅接收来自 LocalAddr 的报
文。
  值得注意的是,在创建 DatagramSocket 类实例时,如果端口已经被使用,会产生
一个 SocketException 的异常抛出,并导致程序非法终止,这个异常应该注意捕获 。
DatagramSocket 类最主要的方法有 4 个:
  Receive(DatagramPacket d):接收数据报文到 d 中。receive

方法产生一个 阻

塞 。
  Send(DatagramPacket d):发送报文 d 到目的地。
  SetSoTimeout(int timeout):设置超时时间,单位为毫秒。