肥宅钓鱼网
当前位置: 首页 钓鱼百科

python tcp数据流解析(PythonUDP协议网络编程六)

时间:2023-07-11 作者: 小编 阅读量: 3 栏目名: 钓鱼百科

pythontcp数据流解析今天继续和大家分享PythonUDP协议网络编程系列知识。如果PythonUDP协议网络编程《四》没有阅读的小伙伴,建议先阅读后,再来学习今天的内容,会有一个比较直观的对比。

python tcp数据流解析?今天继续和大家分享Python UDP 协议网络编程系列知识,我来为大家讲解一下关于python tcp数据流解析?跟着小编一起来看一看吧!

python tcp数据流解析

今天继续和大家分享Python UDP 协议网络编程系列知识。

今日主题:Python 实现的使用命令行进行文件下载的功能。

温馨提示:今日内容与前期推文Python UDP 协议网络编程《四》具有一定的关联性,是在该文章的基础上进行的再一次改造。如果Python UDP 协议网络编程《四》没有阅读的小伙伴,建议先阅读后,再来学习今天的内容,会有一个比较直观的对比。

今日分享内容与已分享的Python UDP 协议网络编程系列推文一样,理论内容较少,今天更偏实战性,以下实现代码需仔细分析、理解每一行代码的作用及相互间的关联关系,可与Python UDP 协议网络编程《四》实现的功能进行对比,相信你会发现其中的不同。

同时建议小伙伴们自行搭建本地环境将代码运行起来,在解决问题的过程中,通过思考与实践才能更好的理解本文主题。

1import sys 2import struct 3from socket import socket,AF_INET,SOCK_DGRAM 4 5filename=""#定义要下载的文件名 6ftp_server_ip=""#定义服务器的ip地址 7username=""#用户名 8password=""#密码 910def run_cmd():11global filename,ftp_server_ip,username,password12if(len(sys.argv)!=3):13print("命令行格式不对,请参照以下标准")14print("="*100)15print("for example:")16print()17print("python python_tftp_download.py username:password@ftp_server_ip filename")18print("=" * 100)19exit()20else:21filename=sys.argv[2]22all=sys.argv[1]23username=str(all).split(":")[0]24password=str(all).split("@")[0].split(":")[1]25ftp_server_ip=str(all).split("@")[1]26print(ftp_server_ip)2728def download_file():29print("step1:准备开始下载" filename "文件")30send_data=struct.pack("!H%dsb5sb"%len(filename),1,filename.encode("utf-8"),0,b'octet',0) #封装一个读文件请求,上面的步骤131print("step2:建立一个udp socket连接")32udp_socket=socket(AF_INET,SOCK_DGRAM) #创建一个udp socket33print("step3:向tftp ip=127.0.0.1 port=69服务器发送读写请求")34udp_socket.sendto(send_data,(ftp_server_ip,69)) #向tftp 服务器发送读写请求35print("step4:新建一个文件句柄,为了接收想下载的文件内容")36fhandle=open(filename,'ab')#在本地创建一个文件,a表示追加,b表示二进制37while 1:38print("step5:开始接收消息,消息内容为接收的数据和服务器信息")39recv_data,server_info=udp_socket.recvfrom(1024) #接收数据,返回的是二维元组,第一个是接收的数据,第二个是服务器ip and port,上面的步骤240operation_code=struct.unpack("!H",recv_data[:2]) #获取操作码41ack_num=struct.unpack("!H",recv_data[2:4]) #获取数据块42print("step6: 获取操作码:", operation_code, "和数据块编号", ack_num)43print("step7: 打印:the server of info is:",server_info)44if operation_code==5:#5就是错误码45print("the file is not found")46break47print("step8:打印接收的数据:",recv_data)48print("step9:开始写文件")49fhandle.write(recv_data[4:])#写内容到文件,因为前四个字节是操作码和数据块,所以要从第四位开始写文件50print("step10:判断文件是否读取完成")51if(len(recv_data)<516):#判断文件是否读取完成,上面的步骤452fhandle.close()53break54'''553、ACK56操作码块编码572Bytes2Bytes58'''#因为发布ACK包的操作码与块编码都是2个字节,所以如下用的是HH59print("step10:封装确认包信息")60send_data1=struct.pack("!HH",4,ack_num[0]) #封装确认包信息61print("step11:获取服务器端ip and port")62server_port=server_info[1]#获取服务器端发送数据的随机端口63server_address=server_info[0]64print("step12:发送ACK 确认包信息")65udp_socket.sendto(send_data1,(server_address,server_port))#发送确认包信息,上面的步骤366print("step13:文件" filename "下载成功!!!")6768def user_login(data):69udp_socket = socket(AF_INET, SOCK_DGRAM)# 建议upd连接70local_address = ('127.0.0.1', 8001)# 定义了本机的ip and port71udp_socket.bind(local_address)# 绑定本机的ip and port72resvice_address=('127.0.0.1', 69) #定义了接收消息机器的ip and port73udp_socket.sendto(str(data).encode("utf-8"),resvice_address)#向接收消息机器发送消息74print("登录成功")75udp_socket.close()76udp_secv_msg()7778def udp_secv_msg():79print("开始接收消息")80udp_sockets = socket(AF_INET, SOCK_DGRAM)# 建立udp socker连接81server_address = (ftp_server_ip, 70)# 定义了服务端的ip and port82udp_sockets.bind(server_address)# 服务端绑定ip and port83print("正在接收消息")84recv_data = udp_sockets.recvfrom(1024)# 收数据等待85print("the data is:",recv_data)86print('接收的内容:', recv_data[0].decode('utf-8'))# 显示收到的信息87print('发送人的地址:', recv_data[1])# 显示收到的信息88udp_sockets.close()8990if __name__ == '__main__':91#命令格式校验92run_cmd()93data = username " " password94print(data)95#第一步登录tftp服务器96user_login(data)97#第二步是下载文件98download_file()

1执行的结果为: 2(venv) D:\BaiduNetdiskDownload\ows-project\wechat\docker-compose1>python pythonFFTP_download_command.py admin:123456@127.0.0.1 requirements.txt 3127.0.0.1 4admin 123456 5登录成功 6开始接收消息 7正在接收消息 8the data is: (b'\xe7\x99\xbb\xe5\xbd\x95\xe6\x88\x90\xe5\x8a\x9f,\xe5\x8f\xaf\xe4\xbb\xa5\xe5\xbc\x80\xe5\xa7\x8b\xe4\xb8\x8a\xe4\xbc\xa0\xe4\xb8\x8b\xe8\xbd\xbd\x 9e6\x96\x87\xe4\xbb\xb6\xe4\xba\x86\xef\xbc\x81\xef\xbc\x81\xef\xbc\x81', ('127.0.0.1', 8000))10接收的内容: 登录成功,可以开始上传下载文件了!!!11发送人的地址: ('127.0.0.1', 8000)12step1:准备开始下载requirements.txt文件13step2:建立一个udp socket连接14step3:向tftp ip=127.0.0.1 port=69服务器发送读写请求15step4:新建一个文件句柄,为了接收想下载的文件内容16step5:开始接收消息,消息内容为接收的数据和服务器信息17step6: 获取操作码: (3,) 和数据块编号 (0,)18step7: 打印:the server of info is: ('127.0.0.1', 64495)19step8:打印接收的数据: b'\x00\x03\x00\x00flask\r\nredis\r\npymysqlflask\r\nredis\r\npymysql'20step9:开始写文件21step10:判断文件是否读取完成22step13:文件requirements.txt下载成功!!!

    推荐阅读
  • 张金兰柳琴专场(从卖唱艺人到柳琴戏)

    日前,笔者专程拜访了这位柳琴戏“北派掌门人”。1928年,张金兰出生在有“柳琴窝”之称的山东郯城。8岁时,张金兰随父亲加入村里的柳琴戏业余班社,10岁就登台演出“压场花”“娃娃生”和“垫戏”,19岁时已成为当地小有名气的柳琴戏演员。19岁之前,张金兰一直随父亲在家乡走街串巷卖艺。新中国成立后,张金兰和柳琴戏一样迎来了新生。张金兰对柳琴戏的未来充满了信心和期待。

  • 94年版石头记(反读石头记第63回)

    一直在道观修炼的贾敬,由于吞服金丹烧胀而死。五月初二日晚因私访怡红院被抓,贾探春和薛宝钗以偷窃“玫瑰露”为由,将黛玉(柳五儿)软禁一夜,这才引发了一连串的悲剧发生。“寿怡红”历史时间为1710年五月初三日,即秦可卿死亡当晚。按此书中若干人说话语气及动用前照饮食诸项,皆东南西北互相兼用,此“姑娘”之称亦南北相兼而用无疑矣。

  • 早餐注意事项(早餐注意事项怎么写)

    咀嚼不细,肠胃负担加重,换上胃食管反流的几率大大增加。消化不良,还会增加肥胖风险。再加上豆浆属于中脂性食品,这种早餐组合的油脂量明显超标,不宜长期食用。小贴士早餐最好少吃豆浆加油条,一星期不宜超过2次;进食当天的午、晚餐应该尽量清淡,并注意多补充蔬菜。

  • 鹅口疮用碳酸氢钠水洗可以吗 碳酸氢钠涂抹鹅口疮要加水吗

    鹅口疮常见于婴幼儿患者,少数有经验的家长提议使用碳酸氢钠,那么对于鹅口疮的患者来说能否使用碳酸氢钠来清洗呢?怎样用碳酸氢钠涂抹鹅口疮方法:在每次喂奶前,用棉签蘸取2%的碳酸氢钠溶液涂抹于患处。

  • peppa pig英文版第七季合集(PeppaPig全六季英文动画片)

    PeppaPig全六季英文动画片小猪佩奇简直太受孩子们的欢迎了,几乎没有人不喜欢,女孩子喜欢佩奇,男孩子喜欢乔治,真是太有爱的一家人作为英语启蒙的动画片,它具有以下几个亮点:​1人物简单主人公(猪)佩奇、佩奇的弟弟乔治、她的爸爸妈妈。

  • 9月猪价开门红,“降温+开学”助力行情续涨

    猪价走势总结分析今日全国外三元生猪出栏均价为14.67元/公斤,较昨日上涨0.03元/公斤。预计国庆节猪价将持续上涨猪价小幅下跌,但集体跌幅并不大。今日全国猪价集体趋稳,北方稳中略有微涨迹象,如山西、河北等地;南方稳中略有微跌,如两湖、广西、四川等地。据农业部发布的相关数据显示,7月份能繁母猪存栏环比下降0.9%,同比下降4.2%,而生猪存栏环比下降0.7%,同比下降4.8%。

  • 煨牛排嫩的方法(怎样做牛排嫩)

    煨牛排嫩的方法牛排适量,橄榄油适量,黑胡椒适量,粗盐适量,大蒜适量,黄油适量,柠檬适量。牛排提前一个小时从冰箱里取出恢复室温,1小时后用厨房纸尽量吸干表面水分,擦上粗盐。烧的时候可以取一枚大蒜切开待用。切忌频繁挪动牛排和频繁翻面,都会造成肉汁的损失。等待的过程中,用大蒜断面在牛排上轻轻的涂抹。把混合了柠檬汁的肉汁浇在牛排上。牛排出锅后,不要立马去切开就吃。

  • 人生真的很讽刺的说说(人生真的很讽刺朋友圈)

    人生就像舞台,不到谢幕的那一刻,永远不会知道自己有多精彩。人生如此艰难,总是比上不足比下有余,何必要用各种标准折磨自己。人生总是充满了无数的变数与选择,不是所有事情都能坦然应对。人生中最艰难的两场考验:等待时机到来的耐心,和应对一切际遇的勇气。人生一日,或闻一善言,见一善行,行一善事,此日方不虚度。人生多磨难,要为自己鼓掌,别让犹豫阻滞了脚步,别让忧伤苍白了心灵。

  • 车感好的表现 什么是车感,怎么样才有车感

    严格来讲,没有“车感”这个东西。“车感”是一个虚构出来的词。如果硬要说的话,车感就是一个人的空间感。上述情况,车主A的车感就比车主B的车感更好。现实当中,通过狭窄的路面、倒入很小的停车位等情况,都是需要车感的。练车感的最好方法,除去个人天赋这个客观因素,最好的方法就是多开,熟能生巧。开的多了,自然就有车感了。