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的时候会报语法错误,网上根本查不到的那种错误。换了版…

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

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

【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经过多年的经验,以及实际验证,配置是没问题的,但是业务…

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 在检,正刊 ☑️征稿领域:提高安全性和隐私性的边缘/云的智能方法的研究,如数字孪生等 ☑️录用案…

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

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

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

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

HarmonyOS应用抓包实战

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

jsp页面bootstrap表格设置页面跳转一直在底部

首先介绍一下bootStrap和bootStrap table: bootStrap: Bootstrap是Twitter推出的一个用于前端开发的开源工具包。 它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。 bootStrap table: Bootstrap table 是一款基于 Bootstrap 的 jQue…

审视AI Agent:追捧、落地,和2024年的To B破局点

“十个AI应用里面,五个办公Agent,三个AIGC,还有两成是回春的数字人。”那么,Agent到底是不是大模型的AGI终局产品? 作者|斗斗 编辑|皮爷 出品|产业家 今年4月份,斯坦福和谷歌的研究者共同创建了一个…

QT小技巧 - 使用QMovie进行gif切帧

简介 使用QMovie 将 gif 进行切帧&#xff0c; magick 进行合并代码 QString gifPath "E:\\workspace\\qt\\gif2imgs\\203526qre64haq3ccoobqi.gif"; // 你的图片QMovie movie(gifPath); movie.setCacheMode(QMovie::CacheNone);qDebug() << movie.frameCou…

腾讯云上mysql连接不上

腾讯云服务器默认没开放&#xff0c;3306端口。 1.去腾讯云控制台 2.找到自己的服务器 3选择防火墙 4.添加规则 至此完事了。

CentOS7之开启ssh远程登录

参考&#xff1a;https://www.cnblogs.com/travis-li/p/12550370.html cd /etc/ssh/ # 修改配置 vim sshd_config# 开启服务 sudo service sshd start# 检查 ps -e | grep sshd# 开机自启 systemctl enable sshd.service# 查看(验证)开机自启服务 [rootlocalhost liangshijie]…