JavaSE:基于UDP协议的编程模型
基于UDP协议的编程模型(熟悉)
1. 编程模型
接收方:
<1> 创建DatagramSocket类型的对象,并提供端口号
<2> 创建DatagramPacket类型的对象,并提供缓冲区
<3> 通过Socket接收数据内容,存放到Packet中,调用receive方法
<4> 关闭Socket
发送方:
<1> 创建DatagramSocket类型的对象
<2> 创建DatagramPacket类型的对象,并提供接收方的通信地址
<3> 通过Socket将Packet中的数据内容发送出去,调用send 方法
<4> 关闭Socket
2. 相关类和方法的解析
<1> DatagramSocket 类
用于描述 发送和接收数据报的套接字 (邮局)
常用的方法如下:
方法声明 | 功能介绍 |
DatagramSocket() | 使用无参的方式,构造对象 |
DatagramSocket(int port) | 根据参数指定的端口号,来构造对象 |
void receive(DatagramPacket p) | 用于接收数据报,存放到参数指定的位置 |
void send(DatagramPacket p) | 用于将参数指定的数据报,发送出去 |
void close() | 关闭Socket,并释放相关资源 |
<2> DatagramPacket类
用于描述数据报,用来实现无连接包裹投递服务。
常用的方法如下:
方法声明 | 功能介绍 |
DatagramPacket(byte[] buf,int length) | 根据参数指定的数组来构造对象,用于接收长度为length的数据报 |
DatagramPacket(byte[] buf,int length,InetAddress address,int port) | 根据参数指定数组来构造对象,将数据报发送到指定地址和端口 |
InetAddress getAddress() | 用于获取发送方 或 接收方的通信地址 |
int getPort() | 用于获取发送方 或 接收方的端口号 |
int getLength() | 用于获取 发送数据 或 接收数据 的长度 |
<3> InetAddress 类
用于描述互联网通信地址信息
常用的方法如下:
方法声明 | 功能介绍 |
static InetAddress getLocalHost() | 获取当前主机的通信地址 |
static InetAddress getByName(String host) | 根据参数指定的主机名获取通信地址 |
3. 代码示例
<1> 发送
1 class SendTest { 2 main(){ 3 DatagramSocket ds = null; 4 5 try{ 6 // 1. 创建DatagramSocket类型的对象 7 ds = new DatagramSocket(); 8 9 // 2. 创建DatagramPacket类型的对象,并提供接收方的通信地址和端口号 10 byte[] bArr = "hello".getBytes(); 11 DatagramPacket dp = new DatagramPacket(bArr,bArr.length,InetAddress.getLocalHost(),8888); 12 13 // 3. 通过Socket发送Packet,调用send方法 14 ds.send(dp); 15 println("发送数据成功!"); 16 17 // 接收回发的数据内容 18 byte[] bArr2 = new byte[20]; 19 DatagramPacket dp2 = new DatagramPacket(bArr2,bArr2.length); 20 ds.receive(dp2); 21 println("接收到的回发消息是: " + new String(bArr2,0,dp2.getLength() ) ); 22 } catch (IOException e) { 23 e.printStackTrace(); 24 } finally { 25 // 4.关闭Socket并释放有关的资源 26 if (null != ds) { 27 ds.close(); 28 } 29 } 30 } 31 }
<2> 接收
1 class ReceiveTest { 2 main(){ 3 DatagramSocket ds = null; 4 5 try{ 6 // 1. 创建DatagramSocket类型的对象,并提供端口号 7 ds = new DatagramSocket(8888); 8 9 // 2. 创建DatagramPacket类型的对象,并提供缓冲区 10 byte[] bArr = new byte[20]; 11 DatagramPacket dp = new DatagramPacket(bArr,bArr.length); 12 13 // 3. 通过Socket接收数据内容,存放到Packet里面,调用receive方法 14 println("等待数据的到来..."); 15 ds.receive(dp); 16 println("接收到的数据内容是:" + new String(bArr, 0, dp.getLength() ) + "!"); 17 18 // 实现将字符串内容"I received!" 回发过去 19 byte[] bArr2 = "I received!".getBytes(); 20 DatagramPacket dp2 = new DatagramPacket(bArr2, bArr2.length, dp.getAddress(), dp.getPort() ); 21 ds.send(dp2); 22 println("回发数据成功!"); 23 } catch (IOException e) { 24 e.printStackTrace(); 25 } finally { 26 // 4.关闭Socket并释放有关的资源 27 if (null != ds) { 28 ds.close(); 29 } 30 } 31 } 32 }