CC00117.bigdatajava——|Java&网络编程.V06|——|Java.v06|udp协议|编程模型|

一、基于udp协议的编程模型(熟悉)
### --- 基于udp协议的编程模型(熟悉)

——>        [基于udp协议的编程模型]——[发送方发送字符串的实现]——[接收方回发消息的实现]
### --- 编程模型

——>    # 接收方:
——>        (1)创建DatagramSocket类型的对象并提供端口号;
——>        (2)创建DatagramPacket类型的对象并提供缓冲区;
——>        (3)通过Socket接收数据内容存放到Packet中,调用receive方法;
——>        (4)关闭Socket;
——>    # 发送方:
——>        (1)创建DatagramSocket类型的对象;
——>        (2)创建DatagramPacket类型的对象并提供接收方的通信地址;
——>        (3)通过Socket将Packet中的数据内容发送出去,调用send方法;
——>        (4)关闭Socket;
二、相关类和方法的解析
### --- DatagramSocket类

——>        java.net.DatagramSocket类主要用于描述发送和接收数据报的套接字(邮局)。
——>        换句话说,该类就是包裹投递服务的发送或接收点。
三、常用的方法如下:
方法声明功能介绍
DatagramSocket()使用无参的方式构造对象
DatagramSocket(int port) 根据参数指定的端口号来构造对象
void receive(DatagramPacket p)用于接收数据报存放到参数指定的位置
void send(DatagramPacket p)用于将参数指定的数据报发送出去
void close()关闭Socket并释放相关资源
四、DatagramPacket类
### --- 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()用于获取发送数据或接收数据的长度
六、InetAddress类
InetAddress类
——>        java.net.InetAddress类主要用于描述互联网通信地址信息。
七、常用的方法如下:
方法声明功能介绍
static InetAddress getLocalHost()用于获取当前主机的通信地址
static InetAddress getByName(String host)根据参数指定的主机名获取通信地址
八、编程代码
package com.yanqi.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();
            }
        }
    }
}
package com.yanqi.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();
            }
        }
    }
}
三、编译打印
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54610:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task19.SendTest
发送数据成功!
接收到的回发消息是:I received!

Process finished with exit code 0
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54599:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task19.ReceiveTest
等待数据的到来...
接收到的数据内容是:hello!
回发数据成功!

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值