UDP Ping程序实现--第5关:客户端向服务器发送消息并接收消息

创作不易,还希望各位大佬支持一下 

👍 点赞,你的认可是我创作的动力! 

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! 

 

任务描述

本关任务:Ping 客户端程序循环向指定服务器发送消息,接收服务端回传的消息并打印统计信息。

相关知识

为了完成本关任务,你需要掌握:

  1. 客户端程序的框架;
  2. 消息内容及编码发送;
  3. 接收消息及解码;
  4. 计算消息的响应时间。
客户端程序结构

客户端程序在创建完套接字后,通过循环向服务器发送消息,然后接收服务器回传的消息,通过计算收到消息及发送消息的时间差,来反映网络的状况。如果超时时间过后还没收到消息,则报出超时异常。

消息编解码

在网络通信中,网络线路中传输的是字节(二进制格式)流bytes。但在我们发送的消息习惯用字符串string来表示,这时就需要用编码encode()和解码decode()函数来转换。

encode()函数:字符串类型(str)提供的方法,用于将字符串类型转换成 bytes 类型,这个过程也称为“编码”。其语法如下: str.encode([encoding="utf-8"][,errors="strict"]) 注意,格式中用 [] 括起来的参数为可选参数,也就是说,在使用此方法时,可以使用 [] 中的参数,也可以不使用。

示例: str.encode() 采用默认的 UTF-8 字符集将 str 编码为字节流 str.encode('GBK') 采用指定的 GBK 字符集将 str 编码为字节流

decode()函数:用于将 bytes 类型的二进制数据转换为 string 类型,这个过程也称为“解码”。其格式如下: bytes.decode([encoding="utf-8"][,errors="strict"]) 示例: bytes.decode() 使用默认的 UTF-8 字符集进行解码为字符串 如果编码时采用的不是默认的 UTF-8 编码,则解码时要选择和编码时一样的格式,否则会抛出异常。

  1. bytes = str.encode("GBK")
  2. bytes.decode() #默认使用 UTF-8 编码,会抛出以下异常。
  3. bytes.decode("GBK") #不会抛出异常
如何发送消息及接受消息

在 UDP 通信中,使用sendto()函数发送 UDP 数据,将数据发送到套接字,输入参数 address 是形式为(host,port)的元组,指定远程地址。返回值是发送的字节数。

接收数据使用recvfrom()函数实现。输入参数为接收缓冲区大小。该函数接收 UDP 数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。

示例如下:

  • 接收数据

msg,addr=udp_server.recvfrom(BUFSIZE)

  • 发送数据

udp_server.sendto(msg,addr)

计算统计信息

在 Ping 客户端程序中,发送消息时将发送消息的序号及发送时间发送到 Ping 服务器,然后接收消息,并将收到消息的时间与发送消息的时间差作为消息的延迟时间进行计算,并打印出来。

编程要求

根据提示,在右侧编辑器代码的BeginEnd之间补充代码,实现将消息序号及时间发送给服务器,并接收服务器回传的消息,并计算往返时间。如果超过超时时间未收到消息,则在异常处理中打印超时信息。

测试说明

平台会对你编写的代码进行测试,并打印出成功接收消息的序号及其相应时间或未接收消息的超时信息。

预期输出:

  1. Sequence 1: Request timed out
  2. Sequence 2: Reply from 127.0.0.1 RTT = 0.000s
  3. Sequence 3: Reply from 127.0.0.1 RTT = 0.000s
  4. Sequence 4: Request timed out
  5. Sequence 5: Reply from 127.0.0.1 RTT = 0.000s
  6. Sequence 6: Reply from 127.0.0.1 RTT = 0.000s
  7. Sequence 7: Request timed out
  8. Sequence 8: Request timed out
  9. Sequence 9: Request timed out
  10. Sequence 10: REquest timed out

代码示例

from socket import *
import timeserverName = '127.0.0.1' # 服务器地址,本例中使用本机地址
serverPort = 12000 # 服务器指定的端口
clientSocket = socket(AF_INET, SOCK_DGRAM) # 创建UDP套接字,使用IPv4协议
clientSocket.settimeout(1) # 设置套接字超时值1秒for i in range(0, 9):sendTime = time.time()message = ('Ping %d %s' % (i+1, sendTime)).encode()     # 生成数据报,编码为bytes以便发送try:########## Begin ########### 将信息发送到服务器clientSocket.sendto(message, (serverName, serverPort))# 从服务器接收信息,同时也能得到服务器地址(BUFSIZE为1024)modifiedMessage, serverAddress = clientSocket.recvfrom(1024) ########## End ##########rtt = time.time() - sendTime # 计算往返时间print('Sequence %d: Reply from %s    RTT = %.3fs' % (i+1, serverName, rtt)) # 显示信息except Exception as e:print('Sequence %d: Request timed out.' % (i+1))clientSocket.close() # 关闭套接字

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库系统概论】第3章-关系数据库标准语言SQL(2)

文章目录 3.4 数据查询3.4.1 单表查询3.4.2 连接查询3.4.3嵌套查询3.4.4 集合查询3.4.5 基于派生表的查询3.4.6 select 语句的目标列 3.4 数据查询 格式 SQL执行顺序 3.4.1 单表查询 基础查询 select * from student // 不重复 select distinct sname from student // 命名…

C++ Lambda表达式的完整介绍

c在c11标准中引入了lambda表达式,一般用于定义匿名函数,使得代码更加灵活简洁。lambda表达式与普通函数类似,也有参数列表、返回值类型和函数体,只是它的定义方式更简洁,并且可以在函数内部定义。 什么是Lambda表达式…

【番外】在Windows安装Airsim/UE4踩坑合集

在Windows安装Airsim/UE4踩坑合集 1.安装过程中一定要确保Epic Games Launcher是英文环境,保存路径什么的也尽量是英文。2.UE4中的虚幻引擎一定要安装4.27版本以上的,不然的话最后运行vs的时候会报语法错误,网上根本查不到的那种错误。换了版…

代码随想录 213. 打家劫舍 II

题目 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在…

Servlet技术之Listener监听器

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 Servlet技术之Listener监听器 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、什么是…

谷歌被曝或再次大裁员!3万员工面临被AI取代

据报道,继1.2万大裁员之后,谷歌又计划重组广告销售部门——这将导致3万名员工面临裁员的风险。 这一年的科技行业,可以说是从年头裁到了年尾,还越裁越多了。 而这次谷歌的部门重组计划,让打工人们发现,除…

运维工程师的出路:探索IT界“万金油”的职业发展之旅

运维工程师的未来之路:不只是IT界的“万金油” 当下,运维工作似乎正处在一个多事之秋,一方面他们必须应对技术的迅速更迭和业务需求的不断提升,另一方面,关于"35岁危机"的论调也不绝于耳。运维人员究竟该如何面对自己的职业生涯,以及他们的出路到底在哪里?这…

【Vulnhub 靶场】【Funbox: Scriptkiddie】【非常简单】【20210720】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/funbox-scriptkiddie,725/ 靶场下载:https://download.vulnhub.com/funbox/Funbox11.ova 靶场难度:简单 发布日期:2021年07月20日 文件大小:1.3 GB 靶场作者&…

盘古信息IMS-MOM制造运营管理系统,构建生产现场管理信息系统的最佳选择

在当今高度竞争的制造行业中,高效的生产管理是企业成功的关键。盘古信息IMS-MOM制造运营管理系统作为一款领先的管理系统其关键特性为制造企业构建生产现场管理信息系统提供了强大的优势。IMS-MOM不仅仅是一个软件系统,更是一种技术和管理手段的结合&…

【Kafka】Kafka客户端认证失败:Cluster authorization failed.

背景 kafka客户端是公司内部基于spring-kafka封装的spring-boot版本:3.xspring-kafka版本:2.1.11.RELEASE集群认证方式:SASL_PLAINTEXT/SCRAM-SHA-512经过多年的经验,以及实际验证,配置是没问题的,但是业务…

第6章1-字符串及正则表达式 p63

字符串的常用方法 p63 p64 字符串是不可变数据类型 方法名描述说明str.lower()将str字符串全部转成小写字母并产生一个新的字符串,str字符串保持不变str.upper()将str字符串全部转成大写字母并产生一个新的字符串,str字符串保持不变str.split(sepNone)…

Java-Maven3.9.6:Maven依赖管理 / 安装-配置-使用

一、理解Maven Maven是一个开源的项目管理工具,主要用于构建和管理Java项目、依赖管理和文档生成,它可以自动下载所需的依赖库,并自动构建整个项目。理解Maven需要了解以下几个方面: 1. 项目对象模型(Project Object…

7.2 uvm_resource_db in UVM

uvm_resource_db是一个类型参数化 type-parameterized的类,它是资源数据库顶部的一个方便层(convenience layer)。这个便利层简化了对低级数据库的访问,并且没有添加新功能。因此,uvm_resource_db不是从uvm_resource类派生的。以下uvm_resour…

Scala安装

Scala安装使用 windows安装,配置环境变量 以下载Scala2.11为例,操作在Windows中安装Scala。 官网下载scala2.11:All Available Versions | The Scala Programming Language下载好后安装。双击msi包安装,记住安装的路径。配置环境变量(和配…

mvtec3d

以bagel为例,其中有calibration、 bagel # 百吉圈(硬面包)calibrationcamera_parameters.jsontestcombinedgt # 缺陷部位的分割剪影pngrgb # 原图pngxyz # tiffcontamination # 污染物同上crack同上good同上 hole同上 traingoodrgbxyzvalidationgood同traincla…

【快刊录用】Springer旗下2区,1个21天录用,12天见刊!

网络安全类SCIE ☑️期刊简介:IF:4.0-5.0,JCR2区,中科院3区 ☑️检索情况:SCIE 在检,正刊 ☑️征稿领域:提高安全性和隐私性的边缘/云的智能方法的研究,如数字孪生等 ☑️录用案…

【Qt-Qss-Style】

Qt编程指南 ■ Qss■ Style■ setStyleSheet ■ style.qss■ border■ 去除弹框背景圆角■ QProgressBar样式表 ■ Qss Qt 支持很多种常见 符号 “>”代表直属子部件,说明两个控件之间是父子关系。 “#”代表后面的字段是前面控件类型的名称,当然也可…

【小白专用】Apache下禁止显示网站目录结构的方法 更新23.12.25

给我一个网站地址,我点开后显示的是目录格式,把网站的目录结构全部显示出来了 这个显示结果不正确,不应该让用户看到我们的目录结构 配置文件的问题,apache配置文件里有一项可以禁止显示网站目录的配置项,禁止掉就好了 在apache…

MySQL集群架构搭建以及多数据源管理实战

MySQL集群架构搭建以及多数据源管理实战 ​ 数据库的分库分表操作,是互联网大型应用所需要面对的最核心的问题。因为数据往往是一个应用最核心的价值所在。但是,在最开始的时候,需要强调下,在实际应用中,对于数据库&a…

HarmonyOS应用抓包实战

Charles抓包原理 Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器,当浏览器连接Charles的代理访问互联网时,Charles可以监控浏览器发送和接收的所有数据。 在开发OpenHarmony/HarmonyOS应用开发时,我们使用的是ohos/axios来进行网络…