background image

Java 知识:Java JDK 中的 Java.net 包控制 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):设置超时时间,单位为毫秒。
  Close():关闭 DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭
Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使