当前位置: 首页 > news >正文

JavaEE|套接字编程之UDP数据报

文章目录

    • 一、DatagramSocket API
      • 构造方法
      • 常用方法
    • 二、DatagramPacket API
      • 构造方法
      • 常用方法
    • E1:回显服务器的实现
    • E2:带有业务逻辑的请求发送

一、DatagramSocket API

在操作系统中,把socket对象当成了一个文件处理。等价于是文件描述符表上的一项。

普通的文件,对应的硬件设备是硬盘,而socket文件,对应的硬件设备是网卡。

【网卡:是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件。】

这也体现了计算机资源一切皆文件的理念。

如果要和多个不同的主机进行通信,就需要创建多个socket对象。

构造方法

方法签名说明
DatagramSocket()创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口 (一般用于客户端)
DatagramSocket(int port)创建一个UDP数据报套接字的Socket,绑定到本机指定的端口(一般用 于服务端)

port是一个端口号,绑定了接收方进程。

那不指定端口号的构造方法呢?此时系统会自动分配一个空闲的端口。

本质上不是进程和端口号建立了联系,而是进程中的socket对象和端口建立了联系。

常用方法

方法签名方法说明
void receieve(DatagramSocket p)从当前套接字对象接受数据报。如果没有接收到会阻塞等待【输出形参数】
void send(DatagramSocket p)从当前套接字对象发送数据包。不会阻塞等待,直接发送
void close()关闭这个数据报套接字对象【类比文件对象关闭,释放资源】

二、DatagramPacket API

它是表示udp中传输的一个报文,构造这个对象,可以指定一些具体的数据进去。

构造方法

方法签名说明
DatagramPacket(byte[] buf,int length)构造接收数据报的对象,接受的数据保存在字节数组(buf)中,接收指定长度(len)
DatagramPacket(byte[] buf,int offset,int length,SocketAddress address)构造一个DatagramPacket以用来发送数据报的对象,发送的数据为字节数组(buf里),从0到指定长度(length)。address指定目的主机ip和端口号 【SocketAddress这个类表示ip+端口号】

常用方法

方法签名说明
InetAddress getAddress()从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取 接收端主机IP地址
int getPort()从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,取接收端主机端口号
byte[] getData()获取数据报中的数据

可以用一个线程receive,把数据放进阻塞队列中,另一个线程进行处理请求并响应。

手定指定,并不一定数组全部用,但是指定长度全部用,留微操空间。不过现在用的比较少了。

E1:回显服务器的实现

普通服务器和回响服务器的区别:

普通服务器,根据收到的请求个性化的返回对应的响应。

回显服务器,省略了其中的根据请求计算响应,请求是什么,就返回什么。

后者代码里边没有实际业务。而实际上最关键的是根据请求计算响应的环节。

注意事项:

  1. 端口号的设置:服务器可以显示指定,是因为是程序员手中的,是可控的,但是客户端一般是用户的,是不可控的E2:请求响应
  2. 个别参数的指定:①respose.length_字符的个数;respose.getBytes().length是字节的个数②offset是一个偏移量,相当于起始位置

UDP回响服务器代码

public class Code01UDPEchoServer {private DatagramSocket socket=null;//OS提供操作网卡的socket对象//服务器一定要关联上一个端口号!!!不能让它随机分配,方便端口号定位public Code01UDPEchoServer(int port) throws SocketException {socket=new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器启动!!");//        //存取数据
//        byte[] bytes=new byte[4096];//2^12
//      这里是直接每次new 了
//        int length=0;//因为要服务很多客户端,所以服务器需要一直在就绪状态while (true) {//1.获取客户端发送过来的请求//  receive是一个输出型参数,所以我们需要先构造一个DatagramPacket的对象DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);//类似给人家一个空白的纸条,两个人说悄悄话socket.receive(requestPacket);//由于这里是一个特殊对象,所以一般把它拿出来做成字符串//offset是一个偏移量//这里指定范围,节省构造字符串的空间[指构造有效范围的]String request = new String(requestPacket.getData(), 0, requestPacket.getLength());//2.根据请求计算响应(请求与响应相同)String respose=process(request);//3.把响应写回客户端//将响应字符串转成字节数组//respose.length_字符的个数//respose.getBytes().length是字节的个数//怎么确定响应返回端口——通过getSocketAddressDatagramPacket answerPacket=new DatagramPacket(respose.getBytes(),respose.getBytes().length,requestPacket.getSocketAddress());socket.send(answerPacket);//4.打印本次请求的处理中间结果System.out.printf("[%s:%d] req:%s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,respose);//获得ip和端口}}//根据请求计算响应public String process(String request){return request;}public static void main(String[] args) throws IOException {Code01UDPEchoServer udpEchoServer=new Code01UDPEchoServer(1200);udpEchoServer.start();}
}

UDP回响客户端

public class Code02UDPEchoClient {private DatagramSocket socket=null;public Code02UDPEchoClient(String serverip, int serverport) throws SocketException {socket=new DatagramSocket();//不需要显示绑定端口,os随机分配serverIp=serverip;serverPort=serverport;}private String serverIp=null;private Integer serverPort=null;//一次通信,需要有两个ip,两个端口,客户端的ip是环回ip,端口号是操作系统随机分配的;服务器的ip和端口号需要声明public void start() throws IOException {System.out.println("客户端启动!");Scanner scanner = new Scanner(System.in);while (true) {// 1. 从控制台读取要发送的数据System.out.print("> ");String request = scanner.next();if (request.equals("exit")) {System.out.println("bye");break;}// 2. 构造成 UDP 请求, 并发送//    构造这个 Packet 的时候, 需要把 serverIp 和 port 都传入过来. 但是此处 IP 地址需要填写的是一个 32位的整数形式.// 这里的 IP 地址是一个字符串. 需要使用 InetAddress.getByName 来进行一个转换.端口号一直都是integer没关系DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length, InetAddress.getByName(serverIp), serverPort);socket.send(requestPacket);// 3. 读取服务器的 UDP 响应, 并解析DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);socket.receive(responsePacket);String response = new String(responsePacket.getData(), 0, responsePacket.getLength());// 4. 把解析好的结果显示出来.System.out.println(response);}}public static void main(String[] args) throws IOException {Code02UDPEchoClient client = new Code02UDPEchoClient("127.0.0.1", 1200);client.start();}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XSqYLyLp-1676721291836)(F:\typora插图\image-20230218194828403.png)]

默认情况下,是只允许运行一个客户端,但是我们可以通过设置同时运行两个客户端的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-refFjdqY-1676721291838)(F:\typora插图\image-20230218195123652.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-glSfyeRD-1676721291839)(F:\typora插图\image-20230218195211579.png)]

E2:带有业务逻辑的请求发送

思路:复用之前的echoServer的代码,只需要重写process的逻辑,即修改业务内容。

public class Code03_UdpDictServer extends Code01UDPEchoServer {private Map<String,String> map=new HashMap<>();public Code03_UdpDictServer(int port) throws SocketException {super(port);map.put("dog","小狗");map.put("cat","小猫");map.put("pig","小猪");}public String process(String request){return map.getOrDefault(request,"尚未查出结果");}public static void main(String[] args) throws IOException {Code03_UdpDictServer udpDictServer=new Code03_UdpDictServer(1200);udpDictServer.start();}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LpoUcOGJ-1676721291840)(F:\typora插图\image-20230218194650960.png)]

当然,除了使用map,我们还可以把词存在硬盘上,通过文件io操作直接读到硬盘上,这里就需要修改udpechoserver的start方法了。

相关文章:

JavaEE|套接字编程之UDP数据报

文章目录一、DatagramSocket API构造方法常用方法二、DatagramPacket API构造方法常用方法E1:回显服务器的实现E2:带有业务逻辑的请求发送一、DatagramSocket API 在操作系统中&#xff0c;把socket对象当成了一个文件处理。等价于是文件描述符表上的一项。 普通的文件&#xf…...

如何使用Python创建一个自定义视频播放器

目录 1、安装vlc的64位版本。 2、安装python的vlc模块。 3、编写如下代码&#xff0c;包含了播放&#xff0c;暂停&#xff0c;停止、音量控制功能。 4、来看一看运行结果。 5、如果遇到播放不了的问题&#xff0c;解决方式如下&#xff1a; 这个例子使用VLC作为视频播放器…...

Elasticsearch进行优化-使用索引拆分(Split)和索引收缩(shrink )

一、索引拆分和收缩的场景 在Elasticsearch集群部署的初期我们可能评估不到位&#xff0c;导致分配的主分片数量太少&#xff0c;单分片的数据量太大&#xff0c;导致搜索时性能下降&#xff0c;这时我们可以使用Elasticsearch提供的Split功能对当前的分片进行拆分&#xff0c…...

数论 —— 高斯记号(Gauss mark)

定义 数学上&#xff0c;高斯记号&#xff08;Gauss mark&#xff09;是指对取整符号和取小符号的统称&#xff0c;用于数论等领域。 设 x∈Rx \in \textbf{R}x∈R&#xff0c;用 [x][x][x] 表示不超过 xxx 的最大整数。也可记作 [x][x][x]。设 x∈Rx \in \textbf{R}x∈R&…...

【随笔】程序员眼中的 CPU,“没有灵魂的躯体”

引言 先引用一段比较有意思的论述&#xff1a; 现实中每个人是由两部分构成&#xff0c;灵魂和躯体&#xff0c;灵魂依附于躯体游走于世间&#xff0c;现实中我们面对的每个人其实面对的是其灵魂而非肉体&#xff0c;肉体不过是表象而已。 灵魂本性乃一恶物&#xff0c;寄生于…...

算法的时间复杂度

算法在编写成可执行程序后&#xff0c;运行时需要消耗时间资源和空间&#xff08;内存&#xff09;资源&#xff0c;因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的。 时间复杂度主要衡量一个算法运行的快慢&#xff0c;而空间复杂度主要衡量一个算法运…...

华为OD机试 - 叠放书籍(Python) | 机试题算法思路 【2023】

最近更新的博客 华为OD机试 - 寻找路径 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - 五键键盘 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - IPv4 地址转换成整数 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - 对称美学 | 备考思路,刷题要点,答疑 …...

进程间通信(重点)

概念 进程是一个独立的资源分配单元&#xff0c;不同进程之间的资源是独立的进程并非孤立的&#xff0c;不同进程需要进行信息的交互和状态的传递&#xff0c;因此需要进程之间的通信【IPC: Inter processes communication】 如qq聊天&#xff0c;qq在每个人的手机上是独立的…...

Reverse入门[不断记录]

文章目录前言一、[SWPUCTF 2021 新生赛]re1二、[SWPUCTF 2021 新生赛]re2三、[GFCTF 2021]wordy[花指令]四、[NSSRound#3 Team]jump_by_jump[花指令]五、[NSSRound#3 Team]jump_by_jump_revenge[花指令]前言 心血来潮&#xff0c;想接触点Reverse&#xff0c;感受下Reverse&am…...

如何实现外网访问内网ip?公网端口映射或内网映射来解决

本地搭建服务器应用&#xff0c;在局域网内可以访问&#xff0c;但在外网不能访问。如何实现外网访问内网ip&#xff1f;主要有两种方案&#xff1a;路由器端口映射和快解析内网映射。根据自己本地网络环境&#xff0c;结合是否有公网IP&#xff0c;是否有路由权限&#xff0c;…...

[acwing周赛复盘] 第 91 场周赛20230218

[acwing周赛复盘] 第 91 场周赛20230218 一、本周周赛总结二、 4861. 构造数列1. 题目描述2. 思路分析3. 代码实现三、4862. 浇花1. 题目描述2. 思路分析3. 代码实现四、4863. 构造新矩阵1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 这周挺难的。T1 贪心分…...

蓝桥12届

小蓝准备用 256MB 的内存空间开一个数组&#xff0c;数组的每个元素都是 32 位 二进制整数&#xff0c;如果不考虑程序占用的空间和维护内存需要的辅助空间&#xff0c;请问 256MB 的空间可以存储多少个 32 位二进制整数&#xff1f;1MB 1024KB 1KB 1024字节(byte) 1字节 8位…...

华为OD机试 - 斗地主(JS)

斗地主 题目 斗地主起源于湖北十堰房县, 据传是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的, 如今已风靡整个中国,并流行于互联网上 牌型: 单顺,又称顺子,最少5张牌,最多12张牌(3...A),不能有2, 也不能有大小王,不计花色 例如:3-4-5-7-8,7-8-9-1…...

【MyBatis】| MyBatis的注解式开发

目录 一&#xff1a;MyBatis的注解式开发 1. Insert注解 2. Delete注解 3. Update注解 4. Select注解 5. Results注解 一&#xff1a;MyBatis的注解式开发 MyBatis中也提供了注解式开发⽅式&#xff0c;采⽤注解可以减少Sql映射⽂件的配置。 当然&#xff0c;使⽤注…...

python自制PDF转换.PNG格式图片(按每页生成图片完整源码)小工具!

使用PyQt5应用程序制作PDF转换成图片的小工具&#xff0c;可以导入PDF文档后一键生成对应的PNG图片。 PDF图片转换小工具使用的中间件&#xff1a; python版本&#xff1a;3.6.8 UI应用版本&#xff1a;PyQt5 PDF文件操作非标准库&#xff1a;PyPDF2 PNG图片生成库&#xff1…...

Go 数组和切片反思

切片的底层数据结构是数组&#xff0c;所以&#xff0c;切片是基于数组的上层封装&#xff0c;使用数组的场景&#xff0c;也完全可以使用切片。 类型比较 我看到 go 1.17 有对切片和数组转换的优化&#xff0c;禁不住纳闷&#xff0c;有什么场景是必须数组来完成的呢&#x…...

win10电脑性能优化设置

win10电脑性能优化设置 目录win10电脑性能优化设置1.桌面图标显示2.wini2.1 “系统”2.1.1专注助手 关2.1.2 电源和睡眠 设置为从不2.1.3 存储 开2.2 网络和Internet2.3 个性化2.4 应用2.5 账户2.6 游戏2.7 隐私墨迹书写和键入个性化&#xff1a;关活动历史记录&#xff1a;全部…...

作为初学者必须要了解的几种常用数据库!

现在已经存在了很多优秀的商业数据库&#xff0c;如甲骨文&#xff08;Oracle&#xff09;公司的 Oracle 数据库、IBM 公司的 DB2 数据库、微软公司的 SQL Server 数据库和 Access 数据库。同时&#xff0c;还有很多优秀的开源数据库&#xff0c;如 MySQL 数据库&#xff0c;Po…...

小红书日常实习一面面经

时间:2月13下午 平台&#xff1a;赛码网&#xff0c;视频面大概70分钟顺序大致是下面&#xff0c;讲到哪问到哪&#xff0c;基础知识最好要结合项目或者实际回答&#xff0c;没录音不完全&#xff0c;有错误请指正首先面试官人超级好&#xff0c;细心提问&#xff0c;耐心解答问…...

将Nginx 核心知识点扒了个底朝天(一)

什么是Nginx&#xff1f; Nginx是一个 轻量级/高性能的反向代理Web服务器&#xff0c;用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡&#xff0c;他可以处理2-3万并发连接数&#xff0c;官方监测能支持5万并发&#xff0c;现在中国使用ngin…...

SSM项目搭建保姆级教程

文章目录1、什么是SSM框架1.1、持久层1.2、业务层1.3、表现层1.4、View层1.5、SpringMVC执行流程1.6、MyBatis2、SSM实战搭建2.1、创建工程2.2、添加依赖2.3、配置spring.xml文件2.4、配置web.xml文件2.5、log4j.properties2.6、准备表2.7、实体类2.8、mapper2.9、service2.10、…...

LeetCode 350. 两个数组的交集 II

原题链接 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给你两个整数数组 nums1nums1nums1 和 nums2nums2nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现…...

Python可以解码吗,解码打码是如何实现的

前言 咳咳&#xff0c;进来的铁汁都是抱着学习的心态进来看的吧&#xff0c;咱今天不讲解解码&#xff0c;咱来说说python如何来实现打码功能~ 这一个个进来的 都是标题党吧哈哈哈 有兴趣的可以继续看看哦 最近重温了一档综艺节目 至于叫什么 这里就不细说了 老是看着看着就…...

Jackson 序列化:Cannot deserialize value of type `java.time.LocalDateTime`

问题描述 使用 jackson 反序列化异常如下&#xff1a; Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDateTime from String “2023-02-13 19:43:01”: Failed to deserialize java.time.LocalDat…...

机试_3_数据结构(一)_习题

数据结构&#xff08;一&#xff09;——练习题 学习完第三章-数据结构&#xff08;一&#xff09;之后&#xff0c;当然要做相应地练习啦~ 注&#xff1a;上述习题都可以在牛客进行测试。 例如&#xff0c;第2题链接&#xff1a;计算表达式_牛客题霸_牛客网 (nowcoder.com)…...

《Hadoop篇》------HDFS与MapReduce

目录 一、HDFS角色职责总结 二、CheckPoint机制 三、Mapreduce序列化 四、Mapper 4.1、官方介绍 4.2、Split计算 4.3、Split和block对应关系 4.4、启发式算法 五、MapTask整体的流程 六、压缩算法 6.1、压缩算法适用场景 6.2、压缩算法选择 6.2.1、Gzip压缩 6.2…...

网络爬虫简介

前言 没什么可以讲的所以就介绍爬虫吧 介绍 网络爬虫&#xff08;英语&#xff1a;web crawler&#xff09;&#xff0c;也叫网路蜘蛛&#xff08;spider&#xff09;&#xff0c;是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。 网路搜索引擎等站点通过…...

通过4个月的自动化学习,现在我也拿到了25K的offer

毕业后的5年&#xff0c;是拉开职场差距的关键时期。有人通过这5年的努力&#xff0c;实现了大厂高薪&#xff0c;有人在这5年里得到贵人的赏识&#xff0c;实现了职级的快速拔升&#xff0c;还有人在这5年里逐渐掉队&#xff0c;成了职场里隐身一族&#xff0c;归于静默。 而…...

分库分表了解

数据切分根据其切分类型&#xff0c;可以分为两种方式&#xff1a;垂直&#xff08;纵向&#xff09;切分和水平&#xff08;横向&#xff09;切分一&#xff1a;垂直&#xff08;纵向&#xff09;切分【基于表或字段划分&#xff0c;表结构不同】1&#xff1a;垂直分库根据业务…...

docker中 gitlab 安装、配置和初始化

小笔记&#xff1a;gitlab配置文件 /etc/gitlab/gitlab.rb 配置项jcLee95 的CSDN博客&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/1…...

山东网站建设方案制作/自己怎么免费做网站网页

在孙鑫老师第二节课视频上听到的&#xff0c;索性就记在这里了&#xff0c;省的下次又不知道怎么说了。在C语言中&#xff0c;struct结构体中是不能定义成员函数的&#xff0c;在C中可以。 但在C语言中可以定义函数指针变量来达到自己所要的目的&#xff0c;不顾这貌似也不太必…...

团购网站怎么做推广/百度收录官网

报错:叫我们删除log4j-over-slf4j.jar, 选中项目 然后搜索对应的包,然后排除即可,我这边已经排除了,就ok了 ctrlF搜索哦! 版本问题,使用插件解决吧: https://yidajava.blog.csdn.net/article/details/103668676...

厦门网站搜索优化/如何制作网页

CoOS提供了一个事件标志的机制&#xff0c;用起来跟信号量差不多。 1、CoCreateFlag(),创建一个事件标志 OS_FlagID CoCreateFlag (BOOL bAutoReset,BOOL bInitialState); bAutoReset&#xff0c;为0表示手动复位&#xff0c;为1表示自动复位。 bInitialState&#xff0c…...

网站功能价格表/百度sem优化师

升级mysql的编码为 utf8mb41. 原因&#xff0c;mysql 的utf8编码最多支持3个字节&#xff0c;导致了有些四个字节的数据插不进去&#xff0c;如emoji表情2. utf8mb4的最低mysql版本支持版本为5.5.3&#xff0c;若不是&#xff0c;请升级到较新版本。2.1 修改database、table和c…...

保温管有哪些网站做/google chrome官网下载

Dan Griffin本文讨论: 新的凭据提供程序体系结构 为什么弃用了基于 GINA 的身份验证 多因素 (Multi-factor) 身份验证 开发和调试凭据提供程序 本文使用了以下技术: Windows Vista、C目录 新旧两种体系结构的比较 混合凭据提供程序 要求 设计 混合凭据提供程序 混合方式的实现…...

wordpress生成sitemap/广告营销的经典案例

使用EEPROM实现LED状态保存与恢复 当定义和使用变量时,代码中生成的数据仅在Arduino开启时才持续存在。 如果重置或关闭Arduino的电源,则存储的数据将消失。如果要保留数据以备将来使用,则需要使用Arduino EEPROM。 即使Arduino重置或电源关闭,它也会存储变量的数据。 EE…...