19.3.1 编程模型

接收方:

(1)创建DatagramSocket类型的对象并提供端口号;
(2)创建DatagramPacket类型的对象并提供缓冲区;
(3)通过Socket接收数据内容存放到Packet中,调用receive方法;
(4)关闭Socket;

发送方:

(1)创建DatagramSocket类型的对象;
(2)创建DatagramPacket类型的对象并提供接收方的通信地址;
(3)通过Socket将Packet中的数据内容发送出去,调用send方法;
(4)关闭Socket;

19.3.2 相关类和方法的解析

(1)DatagramSocket类

java.net.DatagramSocket类主要用于描述发送和接收数据报的套接字(邮局)。
换句话说,该类就是包裹投递服务的发送或接收点。
常用的方法如下:
方法声明 功能介绍
DatagramSocket()
使用无参的方式构造对象
DatagramSocket(int port)
根据参数指定的端口号来构造对象
void receive(DatagramPacket p)
用于接收数据报存放到参数指定的位置
void send(DatagramPacket p)
用于将参数指定的数据报发送出去
void close()
关闭Socket并释放相关资源

(2)DatagramPacket类

java.net.DatagramPacket类主要用于描述数据报,数据报用来实现无连接包裹投递服务。
方法声明 功能介绍
DatagramPacket(byte[] buf, int length)
根据参数指定的数组来构造对象,用于接
收长度为length的数据报
DatagramPacket(byte[] buf, int length,
InetAddress address, int port)
根据参数指定数组来构造对象,将数据报
发送到指定地址和端口
InetAddress getAddress()
用于获取发送方或接收方的通信地址
int getPort()
用于获取发送方或接收方的端口号
int getLength()
用于获取发送数据或接收数据的长度

(3)InetAddress类

java.net.InetAddress类主要用于描述互联网通信地址信息。
方法声明 功能介绍
static InetAddress getLocalHost()
用于获取当前主机的通信地址
static InetAddress getByName(String host)
根据参数指定的主机名获取通信地址

案例代码

接收方类

**package com.lagou.task19;**
**import java.io.IOException;**
**import java.net.DatagramPacket;**
**import java.net.DatagramSocket;**
**public class ReceiveTest {**
** public static void main(String[] args) {**
** DatagramSocket ds = null;**
** try {**
** // 1.创建DatagramSocket类型的对象并提供端口号**
** ds = new DatagramSocket(8888);**
** // 2.创建DatagramPacket类型的对象并提供缓冲区**
** byte[] bArr = new byte[20];**
** DatagramPacket dp = new DatagramPacket(bArr, bArr.length);**
** // 3.通过Socket接收数据内容存放到Packet里面,调用receive方法**
** System.out.println("等待数据的到来...");**
** ds.receive(dp);**
** System.out.println("接收到的数据内容是:" + new String(bArr, 0, dp.getLength()) + "!");**
** // 实现将字符串内容"I received!"回发过去**
** byte[] bArr2 = "I received!".getBytes();**
** DatagramPacket dp2 = new DatagramPacket(bArr2, bArr2.length, dp.getAddress(), dp.getPort());**
** ds.send(dp2);**
** System.out.println("回发数据成功!");**
** } catch (IOException e) {**
** e.printStackTrace();**
** } finally {**
** // 4.关闭Socket并释放有关的资源**
** if (null != ds) {**
** ds.close();**
** }**
** }**
** }**
**}**

发送方类

**package com.lagou.task19;**
**import java.io.IOException;**
**import java.net.DatagramPacket;**
**import java.net.DatagramSocket;**
**import java.net.InetAddress;**
**public class SendTest {**
** public static void main(String[] args) {**
** DatagramSocket ds = null;**
** try {**
** // 1.创建DatagramSocket类型的对象**
** ds = new DatagramSocket();**
** // 2.创建DatagramPacket类型的对象并提供接收方的通信地址和端口号**
** byte[] bArr = "hello".getBytes();**
** DatagramPacket dp = new DatagramPacket(bArr, bArr.length, InetAddress.getLocalHost(), 8888);**
** // 3.通过Socket发送Packet,调用send方法**
** ds.send(dp);**
** System.out.println("发送数据成功!");**
** // 接收回发的数据内容**
** byte[] bArr2 = new byte[20];**
** DatagramPacket dp2 = new DatagramPacket(bArr2, bArr2.length);**
** ds.receive(dp2);**
** System.out.println("接收到的回发消息是:" + new String(bArr2, 0, dp2.getLength()));**
** } catch (IOException e) {**
** e.printStackTrace();**
** } finally {**
** // 4.关闭Socket并释放有关的资源**
** if (null != ds) {**
** ds.close();**
** }**
** }**
** }**
**}**