1. #coding=utf-8
  2.  
  3. from socket import *
  4. from threading import Thread
  5. import struct
  6.  
  7. def recvData(fileName,udpSocket,lastBlockNum):
  8. lastBlockNum = lastBlockNum
  9. cycleIndex = 0 #当文件较大,块编号大于65535时,循环索引加1,重置块编号为1
  10. while True:
  11. dataInfo, dstInfo = udpSocket.recvfrom(1024)
  12. opCode,blockNum = struct.unpack("!HH",dataInfo[:4])
  13. if opCode == 3:
  14. if blockNum == 1 and cycleIndex==0:
  15. f = open(fileName,'wb')
  16. data_fmt = '!%ds'%(len(dataInfo)-4)
  17. data_content = struct.unpack(data_fmt,dataInfo[4:])
  18.  
  19. if lastBlockNum+1 == blockNum:
  20. f.write(data_content[0])
  21.  
  22. ack_data = struct.pack("!HH",4,blockNum)
  23. udpSocket.sendto(ack_data,dstInfo)
  24.  
  25. if blockNum==65535:
  26. cycleIndex += 1
  27. lastBlockNum = blockNumelif blockNum>65535:
  28. lastBlockNum=0
  29. else:
  30. lastBlockNum = blockNum
  31.  
  32. if len(dataInfo)<516:
  33. print("下载完毕!")
  34. f.close()
  35. break
  36. elif opCode == 5:
  37. errorNum = blockNum
  38. err_fmt = "!%ds"%(len(dataInfo)-5)
  39. errorMsg = struct.unpack(err_fmt,dataInfo[4:-1])
  40. print("出错信息%s %s"%(errorMsg,errorNum))
  41. break
  42.  
  43. def sendData(fileName,udpSocket):
  44. ipInfo = ("10.0.0.4", 69)
  45. dataInfo = struct.pack("!H%dsB5sB"%len(fileName), 1, fileName.encode("gb2312"), 0, 'octet'.encode("gb2312"), 0)
  46. udpSocket.sendto(dataInfo, ipInfo)
  47.  
  48. def main():
  49. fileName = "CentOS-7-x86_64-Minimal-1611.iso"
  50. udpSocket = socket(AF_INET, SOCK_DGRAM)
  51. bind = ("", 38438)
  52. udpSocket.bind(bind)
  53. lastBlockNum = 0
  54.  
  55. t1 = Thread(target=sendData,args=(fileName,udpSocket,))
  56. t1.start()
  57.  
  58. t2 = Thread(target=recvData,args=(fileName,udpSocket,lastBlockNum))
  59. t2.start()
  60.  
  61. if __name__ == "__main__":
  62. main()

Python设计TFTP客户端的更多相关文章

  1. python网络-TFTP客户端开发(25)

    一. TFTP协议介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议) 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议 特点: ...

  2. TFTP协议介绍-python实现tftp客户端

    1. TFTP协议介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议) 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议 特点: ...

  3. 用Python设计第一个游戏 - 零基础入门学习Python002

    用Python设计第一个游戏 让编程改变世界 Change the world by program 有些鱼油可能会说,哇,小甲鱼你开玩笑呐!这这这这就上游戏啦?你不打算给我们讲讲变量,分支,循环,条 ...

  4. 利用PYTHON设计计算器功能

    通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...

  5. 用Python设计一个经典小游戏

    这是关于Python的第9篇文章,介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习 ...

  6. 【RL-TCPnet网络教程】第40章 RL-TCPnet之TFTP客户端(精简版)

    第40章      RL-TCPnet之TFTP客户端 本章节为大家讲解RL-TCPnet的TFTP客户端应用,学习本章节前,务必要优先学习第38章的TFTP基础知识.有了这些基础知识之后,再搞本章节 ...

  7. 基于Python的ModbusTCP客户端实现

    Modbus协议是由Modicon公司(现在的施耐德电气Schneider Electric)推出,主要建立在物理串口.以太网TCP/IP层之上,目前已经成为工业领域通信协议的业界标准,广泛应用在工业 ...

  8. 原!!win7-64 安装python的 redis客户端库

    安装python的redis客户端库 本人系统已装python2.7 利用cmd命令行: 1.cmd-->python -->>>进入python命令下 >>> ...

  9. 如何使用TFTP客户端工具修复路由器固件

    如何使用TFTP客户端工具修复路由器固件 编号:12083       来自:NetGear       更新日期:2013-10-14       访问数量:24650 NETGEAR无线路由器中, ...

随机推荐

  1. Spring【依赖注入】就是这么简单

    前言 在Spring的第二篇中主要讲解了Spring Core模块的使用IOC容器创建对象的问题,Spring Core模块主要是解决对象的创建和对象之间的依赖关系,因此本博文主要讲解如何使用IOC容 ...

  2. mariadb 压缩包gz安装方式

    1.解压安装包tar -zxvf mariadb-5.5.56-linux-x86_64.tar.gz 2.cd support-filescp my-small.cnf /etc/my.cnf 2. ...

  3. sqlserver的分页语句

    SELECT * FROM ( SELECT *,ROW_NUMBER() OVER (ORDER BY ID asc) AS RowNum FROM qnfh ) AS TWHERE T.RowNu ...

  4. Java 多线程之哪个对象才是锁?

    问题背景 在感觉正常的使用ArrayList的迭代删除的操作的时候,发现了如下的崩溃日志: Caused by: java.util.ConcurrentModificationException a ...

  5. Spring @AfterReturning 总是返回null

    在学习Spring Aop时,遇到一个问题,当 @Around(环绕通知)与 @AfterReturning(后置通知)共存 时,@AfterReturning 通过属性 returning = &q ...

  6. 仿QQ发语音、图片选择、表情选择demo

    一款仿QQ发语音.图片选择.调用拍照.表情选择的demo git地址:https://github.com/PureLovePeter/pic.git.  喜欢的请 star  star star,共 ...

  7. Hybrid App混合模式开发的了解

    Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app,兼具"Native App良好用户交互体验的优势"和"Web Ap ...

  8. 设计模式——简单工厂模式(C++实现)

    #include <iostream> #include <string> using namespace std; class COperator { public: ; p ...

  9. Keeweb-Linux的密码管理器

    Keeweb-Linux的密码管理器 如今,我们依赖于越来越多的线上服务.我们每注册一个线上服务,就要设置一个密码:如此,我们就不得不记住数以百计的密码.这样对于每个人来说,都很容易忘记密码.那么,下 ...

  10. struts2和spring mvc的区别

    在项目中使用struts2和spring mvc为了实现后台的业务代码和前台数据之间的传递,现在基本上不会有用struts2的了,几次面试问的最多的关于struts2的问题就是struts2和spri ...