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 }
原文地址:https://www.cnblogs.com/JasperZhao/p/14884999.html