3.3用户数据报协议( UDP)
? 本节主要内容
– UDP协议的基本概念
– DatagramSocket类
– DatagramPacket类
– 基于 UDP协议的网络程序设计
3.3用户数据报协议( UDP)
? 数据报( Datagram) 是通过网络传递的一个独
立的、自我封装的数据包,它可以从网络中的
一个点传递到另一个点。
? 数据报通信是以 UDP协议为基础的,因此使用
UDP进行数据传输的耗费比较少,比较适合一
些要求响应速度快、对传输质量要求不高的网
络应用。
3.3.1 UDP Socket特性
? UDP( User Datagram Protocol,用户数据报协议)
是一种不可靠的、无连接和面向消息的协议。
? 和 TCP一样,在 Java中也支持基于 UDP的网络程序设
计。它是通过 UDP的 UDP 端口来实现 UDP协议的网
络通信。其工作过程如下,
1,创建一个适当的要发送且注明收发人地址的数据报。
2,为一个特定的应用程序建立一个传输端口来传送和接收数据
包。
3,将数据报插入一个传输端口中进行传输。
4,等待接收来自于传输端口的一个数据报。
5,解码数据报以解开消息、接收者和其它信息。
3.3.2 Java UDP类
? 在 java.net包中提供了两个类,
– 1.DatagramPacket类
? 在 Java中的 net程序包中具有实现 UDP通信的必要工
具。为了传送、接收数据报,Java提供了
DatagramPacket类。
? 要创建一个发送数据的数据报,可使用下面两个构造
方法,
– DatagramPacket(byte [] buf,int length,InetAddress address,int port);
– DatagramPacket(byte [] buf,int offset,int length,InetAddress address,int port);
3.3.2 Java UDP类
? 要接收一个数据报,用户必须使用下面两种
DatagramPacket构造方法中的其中之一,用于
保存接收到的数据。这两个构造方法是,
– DatagramPacket(byte[] buf,int offset,int length);
– DatagramPacket(byte[] buf,int length);
3.3.2 Java UDP类
? 当接收到一个数据报后,用户可以读取数据。
允许用户获得关于消息的方法如下,
– int getLength(); 用于获取数据报中的数据部分的字
节数 ;
– byte[] getData(); 获取一个包中含有接收到的字节
数组 ;
– InetAddress getAddress(); 获取一个表示传送者的
InetAddress对象 ;
– int getPort(); 获得当前所使用的 UDP端口
3.3.2 Java UDP类
? 2.DatagramSocket类
– 在 Java中,数据报的收发是由 DatagramSocket类来
实现的,DatagramSocket类创建一个 UDP端口,可
使用下面三种构造方法,
? DatagramSocket() throws IOException
? DatagramSocket(int port) throws IOException
? DatagramSocket(int port,InetAddress localAddr)
throws IOException
3.3.2 Java UDP类
? DatagramSocket类中的常用方法有,
– void connect(InetAddress address,int port ) 以地址 address,
端口号 port建立套接字
– InetAddress getInetAddress() 从当前 Socket中获取 IP地址
– int getPort() 返回当前 Socket中打开的端口号
– void receive(DatagramPacket p) 从当前 Socket中接收一个数
据报
– void send(DatagramPacket p) 从当前套接字对象中发送一个
数据报
3.3.2 Java UDP类
– 通常在接收数据前,要创建一个 DatagramSocket对
象和 DatagramPacket对象(要给出接收数据的缓冲
区及其长度),然后调用 DatagramSocket类的方法
receive()等待数据报的到来。 receive()方法将一直
等待,直到收到一个数据报为止。
? DatagramSocket socket = new
DatagramSocket(4445); //4445为端口号
? DatagramSocket packet = new DatagramPacket(buf,
256); //创建一个缓冲区为 256的数据报
? socket.receive(packe); //等待接收数据报
3.3.2 Java UDP类
? 而发送数据前,也要创建一个 DatagramSocket对象和
一个 DatagramPacket对象 。发送数据是通过
DatagramSocket的方法 send()实现的。 send()方法将
根据数据报的目的地址来寻址和传递数据报。
– DatagramSocket socket = new DatagramSocket(4446); //
在 4446端口打开一个 UDP套接字
– //创建待发送的数据报
– DatagramPacket packet = new DatagramPacket(buf,length,
address,port);
– socket.send(packet); //从当前套接字中发送数据报
3.3.2 Java UDP类
? 示例 3.3.1 请使用 UDP实现一个对等聊天程序。
– 分析,
? 1)创建用于发送聊天信息的 UDP套接字。可由下面语句来实现,
– udpSocket = new DatagramSocket();//创建发送 UDPSocket对象
? 2) 响应用户的发送事件。主要需要捕获用户的行为事件,并加以处理。
– public void actionPerformed(ActionEvent arg0) {
– try{
– send(gui.getMessage());
– }catch(Exception e){
– gui.displayMessage(e.toString());
– }}
? 3) 发送用户的聊天消息给对方。要实现消息的发送首先必须先获得用户输入的信息,然后根据收信人的 IP地址和监听端口号创
建一个发送数据报 ; 然后从打开的 UDP Socket中发送出去。
3.3.2 Java UDP类
– 4)接收对方发送的消息。
? dp = new DatagramPacket(buff,buff.length); //创建接收数据报
对象
? ds = new DatagramSocket(localPort); //创建在指定端口监听的
接收套接字
? ds.receive(dp); //读取一个数据报
– 5)解码收到的数据报,并显示收到的信息。
? msg = new String(dp.getData(),0,dp.getLength()); //将字节串转
换成消息字符串
? gui.displayMessage("Remote,"+msg); //显示收到的信息
3.3.2 Java UDP类
? 运行后的结果如下图,
3.3.2 Java UDP类
? 练习 3.3.1 请使用 UDP套接字编制一个客户 /服
务应用程序,要求实现客户端能实时显示服务
器端的时钟。
– 要求,
? 1.创建客户端,要求具有一个显示服务端时钟的界面
和打开一个指定的监听端口 ;
? 2.创建服务端,要求该服务端具有获取本地时钟的功
能,并使用 UDP套接字将时钟发送到客户端并显示。
小结
? 1.UDP Socket特性
– UDP( User Datagram Protocol,用户数据报协议)是
一种不可靠的、无连接和面向消息的协议。
– 工作过程如下,
? 1)创建一个适当的要发送且注明收发人地址的数据报。
? 2)为一个特定的应用程序建立一个传输端口来传送和接收数据包。
? 3)将数据报插入一个传输端口中进行传输。
? 4)等待接收来自于传输端口的一个数据报。
? 5)解码数据报以解开消息、接收者和其它信息。
? 2,DatagramPacket类
– 在 Java中的 net程序包中具有实现 UDP通信的必要工具。为了传送、
接收数据报,Java提供了 DatagramPacket类。
? 3,DatagramSocket类
– 在 Java中,数据报的收发是由 DatagramSocket类来实现的,
DatagramSocket类创建一个 UDP端口。