|NO.Z.00117|——————————|BigDataEnd|——|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
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」