• 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 }
  • 相关阅读:
    mysql5.6 TIME,DATETIME,TIMESTAMP
    CMake 简单介绍 图
    mysql 源码编绎修改 FLAGS,调试MYSQL
    CHAR 详解
    关于MySQL的各种总结
    Shell编程速查手册
    cmake 手册系列
    编译安装GCC 5.2.0
    宽字符相关的输入输出
    Makefile
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/14884999.html
Copyright © 2020-2023  润新知