Java登陆第十三天——网络编程(三)DatagramSocket
1.Java登陆第一天——Mysql安装2.Java登陆第一天——Maven入门3.Java登陆第二天——SQL之DDL4.Java登陆第二天——SQL之DML5.Java登陆第三天——SQL之DQL(一)基础查询、聚合函数、分组查询6.Java登陆第四天——SQL之DQL(二)分页查询、多表查询、自连接7.Java登陆第五天——SQL之DQL(三)子查询8.Java登陆第六天——SQL之表复制,表去重,合并查询9.Java登陆第六天——SQL之SQL(四)外连接10.Java登陆第六天——SQL之约束11.Java登陆第七天——SQL之事务12.Java登陆第七天——SQL之事务隔离13.Java登陆第八天——SQL之DCL14.Java登陆第九天——JDBC(一)DriverManager、Connection、Statement15.Java登陆第十天——JDBC(二)ResultSet16.Java登陆第十一天——JDBC(三)PreparedStatement、CLOB、BLOB17.Java登陆第十二天——网络编程(一)网络的概念18.Java登陆第十二天——网络编程(二)InetAddress、Socket
19.Java登陆第十三天——网络编程(三)DatagramSocket
20.Java登陆第十四天——网络编程(四)韩顺平网络编程21.Java登陆第十五天——网络编程(四)韩顺平网络编程22.Java登陆第十六天——网络编程(四)韩顺平网络编程23.Java登陆第十七天——网络编程(四)韩顺平网络编程完成24.Java登陆第十七天——正则表达式25.Java登陆第十八天——Java8之Lambda表达式26.Java登陆第十九天——HTML规范与语法27.Java登陆第二十天——HTML常用标签28.Java登陆第二十一天——CSS29.Java登陆第二十二天——JavaScript入门30.Java登陆第二十三天——JavaScript对象、JSON、事件31.Java登陆第二十四天——JavaScriptBOM、DOM32.Java登陆第二十五天——Tomcat、认识JavaWeb项目33.Java登陆第二十六天——Http34.Java登陆第二十六天——Servlet35.Java登陆第二十七天——多种方法Servlet映射、Content-Type36.Java登陆第二十八天——Servlet生命周期37.Java登陆第二十九天——Servlet继承关系,service和doGet的区别38.Java登陆第二十九天——ServletConfig和ServletContext39.Java登陆第二十九天——HttpServletRequest和HttpServletResponse40.Java登陆第二十九天——请求转发和响应重定向41.Java登陆第三十天——Cookie和Session42.Java登陆第三十天——域对象43.Java登陆第三十一天——Filter44.Java登陆第三十一天——监听器45.Java登陆第三十二天——AJAX和异步46.Java登陆第三十二天——前端工程化47.Java登陆第三十二天——ES6(一)let、const、模板字符串、解构表达式、箭头函数48.Java登陆第三十三天——ES6(二)reset、spread、Class类语法糖49.Java登陆第三十三天——ES6(二)浅拷贝、深拷贝50.Java登陆第三十三天——ES6(二)模块、模块化51.Java登陆第三十四天——Node.js安装、npm配置、npm命令52.Java登陆第三十四天——使用Vite创建工程化的Vue3项目53.Java登陆第三十五天——Vite+Vue3目录结构、.vue文件理解(SFC)54.Java登陆第三十五天——VUE初始页面解析55.Java登陆第三十六天——VUE3引入CSS56.Java登陆第三十六天——VUE3响应式入门、setup语法糖57.Java登陆第三十七天——VUE3插值表达式、文本渲染、属性渲染、事件绑定58.Java登陆第三十七天——VUE3响应式基础、条件渲染、列表渲染59.Java登陆第三十八天——VUE3双向绑定,监听器(侦听器)60.Java登陆第三十八天——VUE3生命周期、钩子函数、组件拼接、组件传参(组件通信)61.Java登陆第三十九天——Router路由入门62.Java登陆第三十九天——Router编程式路由,路由传参63.Java登陆第四十天——Router路由守卫64.Java登陆第四十天——Router路由守卫练习65.Java登陆第四十一天——Promise、async关键字、await关键字66.Java登陆第四十一天——Axios67.Java登陆第四十二天——Axios拦截器68.Java登陆第四十二天——跨域69.Java登陆第四十三天——Pinia70.Java登陆第四十四天——跟写微头条遇到的问题DatagramSocket
使用DatagramSocket(数据套接字)可以进行UDP程序的开发,此类可以建立单向地、不可靠地、快速地通信。
在UDP编程中,混淆了服务端和客户端的概念。因为通信是单向的,所以身份可以随时切换。
(也有人把TCP称作服务端客户端,UDP称作发送端和接收端)
DatagramSocket类常用方法如下:
方法 | 类型 | 描述 |
---|---|---|
public DatagramSocket(int port) throws SocketException | 构造方法 | 监听指定端口 |
public void send(DatagramPacket p) throws IOException | 普通方法 | 发送数据报 |
public synchronized void receive(DatagramPacket p) throws IOException | 同步方法 | 等待客户端请求并接收数据报(没有会一直阻塞) |
DatagramPacket
在Java中,使用DatagramPacket类操作数据报。
常用方法如下:
方法 | 类型 | 描述 |
---|---|---|
public DatagramPacket(byte buf[], int length) | 构造方法 | 构建数据报的数据、数据长度 |
public DatagramPacket(byte buf[], int length, InetAddress address, int port) | 构造方法 | 构建数据报的数据、数据长度、目标地址和端口 |
public synchronized byte[] getData() | 同步方法 | 拆开数据报,获取数据 |
public synchronized int getLength() | 普通方法 | 获取数据长度 |
栗子:编写一个本机的接收端,端口为9999
接收端,Test25receive类:
//接收端,Test25receive类
public static void main(String[] args) {
try {
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] bytes = new byte[1024];//创建容器,留作数据
System.out.println("成功创建容器,监听9999端口");
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
//若无客户端访问9999端口,程序就会阻塞在此;若有客户端访问9999端口,程序继续向下执行。
System.out.println("1");//若执行到此证明不会阻塞
datagramSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
程序运行结果:
成功创建容器,监听9999端口
//阻塞中....
栗子:发送端给本机9999端口的接收端发送hello,world!
发送端,Test25send类:
//发送端,Test25send类
public class Test25send {
public static void main(String[] args) {
try {
DatagramSocket datagramSocket = new DatagramSocket();//因为接收端不打算回消息,所以不监听端口
byte[] bytes = "hello,world!".getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"),9999);
//构建一个数据报,其目的地址是本机的9999端口。
datagramSocket.send(datagramPacket);
System.out.println("成功发送数据报");
datagramSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收端,Test25receive类:
//接收端,Test25receive类
public class Test25receive {
public static void main(String[] args) {
try {
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] bytes = new byte[1024];//创建容器,留作数据
System.out.println("成功创建容器,监听9999端口");
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
//若无发送端访问9999端口,程序就会阻塞在此;若有发送端访问9999端口,程序继续向下执行。
byte[] data = datagramPacket.getData();//拆包后的数据
System.out.println(new String(data,0, datagramPacket.length));//长度一定是数据报获取的长度,否则带有bytes后的很多00000
System.out.println("1");//若执行到此证明不会阻塞
datagramSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
先运行接收端,再运行发送端,程序运行结果:
栗子:发送端发送信息"四大名著是哪些?"
接收端接收问题后回复""四大名著有。。。。
否则回复what?
客户端,Test25send类:
//客户端,Test25send类
public class Test25send {
public static void main(String[] args) {
try {
DatagramSocket datagramSocket = new DatagramSocket(9988);//因为接收端要回消息,监听端口9988
byte[] bytes = "四大名著11哪些?".getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"),9999);
//构建数据报,其目的地址是本机的9999端口。
datagramSocket.send(datagramPacket);
System.out.println("成功发送数据报");
//构建数据报,其目的地址是本机的9999端口。
byte[] b = new byte[1024];
DatagramPacket datagramPacket2 = new DatagramPacket(b, b.length, InetAddress.getByName("localhost"),9999);
datagramSocket.receive(datagramPacket2);
System.out.println(new String(datagramPacket2.getData(),0, datagramPacket2.getLength()));
datagramSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端,Test25receive类:
//服务端,Test25receive类
public class Test25receive {
public static void main(String[] args) {
try {
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] bytes = new byte[1024];//创建容器,留作数据
System.out.println("成功创建容器,监听9999端口");
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
//若无客户端访问9999端口,程序就会阻塞在此;若有客户端访问9999端口,程序继续向下执行。
String s = new String(datagramPacket.getData(), 0, datagramPacket.getLength());//拆包后的数据
DatagramPacket datagramPacket2;
byte[] b;
if("四大名著是哪些?".equals(s)) {
b = "四大名著有。。。。".getBytes();
} else {
b = "what?".getBytes();
}
datagramPacket2 = new DatagramPacket(b, b.length, InetAddress.getByName("localhost"), 9988);
datagramSocket.send(datagramPacket2);
datagramSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
程序运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~