• tftp是基于udp的协议
  • 实现简单的tftp,首先要有tftp的协议图。
  • tftp默认接收端口为69,但每次有连接过来后,tftp会随机分配一个端口来专门为这个连接来服务。
  • 操作码:1.上传 2.下载 3.传数据 4.接收确认 5.错误码

tftp服务器简单实现:

from threading import Thread
from socket import *
import structdef upload(filename,user_ip,user_port):num = 0f = open(filename,'ab') s_up = socket(AF_INET,SOCK_DGRAM)send_data_1 = struct.pack("!HH",4,num)s_up.sendto(send_data_1,(user_ip,user_port))  #第一次用随机端口发送while True:recv_data,user_info = s_up.recvfrom(1024)  #第二次客户连接我随机端口caozuohao_up,ack_num = struct.unpack('!HH',recv_data[:4])print(caozuohao_up,ack_num,num)if int(caozuohao_up) == 3 and ack_num == num :f.write(recv_data[4:])send_data = struct.pack("!HH",4,num)s_up.sendto(send_data,(user_ip,user_port)) #第二次我用随机端口发num = num + 1if len(recv_data) < 516:print(user_ip+'上传文件'+filename+':完成')f.close()exit()def download(filename,user_ip,user_port):s_down = socket(AF_INET, SOCK_DGRAM)num = 0try:f = open(filename,'rb')except:error_data = struct.pack('!HHHb',5,5,5,num)s_down.sendto(error_data, (user_ip,user_port))  #文件不存在时发送exit()  #只会退出此线程while True:read_data = f.read(512)send_data = struct.pack('!HH',3,num) + read_datas_down.sendto(send_data, (user_ip,user_port))  #数据第一次发送if len(read_data) < 512:print('传输完成, 对方下载成功')exit()        recv_ack =  s_down.recv(1024)  #第二次接收caozuoma,ack_num = struct.unpack("!HH", recv_ack)
#        print(caozuoma,ack_num,len(read_data))num += 1if int(caozuoma) != 4 or int(ack_num) != num-1 :exit()f.close()s = socket(AF_INET,SOCK_DGRAM)
s.bind(('',69))def main():while 1:recv_data,(user_ip,user_port) = s.recvfrom(1024)  #第一次客户连接69端口print(recv_data, user_ip, user_port)if struct.unpack('!b5sb',recv_data[-7:]) == (0, b'octet', 0):caozuoma = struct.unpack('!H',recv_data[:2])filename = recv_data[2:-7].decode('gb2312')if caozuoma[0] == 1:print('对方想下载数据',filename)t = Thread(target = download, args = (filename,user_ip,user_port)) t.start()           elif caozuoma[0] == 2:print('对方想上传数据',filename)t = Thread(target = upload, args = (filename,user_ip,user_port)) t.start()           if __name__ == '__main__':main()

上传数据简单实现:

#!/usr/bin/env python3
#coding=utf-8import struct
from socket import *server_ip = '192.168.119.157'
send_data_1 = struct.pack('!H8sb5sb',2,'王辉.jpg'.encode('gb2312'),0,b'octet',0)
s = socket(AF_INET,SOCK_DGRAM)
s.sendto(send_data_1,(server_ip,69)) #第一次发给服务器69端口

f = open('王辉.jpg','rb')recv_data = s.recvfrom(1024) #第一次接收数据
rand_port = recv_data[1][1]
print()
ack_num = struct.unpack("!HH",recv_data[0][:4])
num = 0
while True:read_data = f.read(512)send_data = struct.pack('!HH',3,num) + read_datas.sendto(send_data,(server_ip,rand_port)) #第二次发给服务器的随机端口recv_data_2,userinfo = s.recvfrom(1024)print(recv_data_2)ack_num = struct.unpack('!H',recv_data_2[2:4])print(len(read_data),num,ack_num[0],rand_port)if len(read_data) < 512 or ack_num[0] != num :breaknum = num + 1

下载数据简单实现:

#!/usr/bin/env python3
#coding=utf-8import struct
from socket import *filename = 'test.jpg'
server_ip = '192.168.1.113'send_data = struct.pack('!H%dsb5sb'%len(filename),1,filename.encode('gb2312'),0,'octet'.encode('gb2312'),0)
s = socket(AF_INET,SOCK_DGRAM)
s.sendto(send_data,(server_ip,69)) #第一次发送, 连接服务器69端口

f = open(filename,'ab')while 1:recv_data = s.recvfrom(1024) #接收数据caozuoma,ack_num = struct.unpack('!HH',recv_data[0][:4]) #获取数据块编号rand_port = recv_data[1][1]  #获取服务器的随机端口if int(caozuoma) == 5:print('服务器返回: 文件不存在...')breakprint(caozuoma,ack_num,rand_port,len(recv_data[0]))f.write(recv_data[0][4:])if len(recv_data[0]) < 516:breakack_data = struct.pack("!HH",4,ack_num)s.sendto(ack_data,(server_ip,rand_port))  #回复ACK确认包

转载于:https://www.cnblogs.com/Erick-L/p/7144139.html

python实现简单tftp(基于udp)相关推荐

  1. C++socket编程(八):8.2简单的基于UDP的客户端和服务端

    UDP中的服务器端和客户端没有连接 UDP 不像 TCP,无需在连接状态下交换数据,因此基于 UDP 的服务器端和客户端也无需经过连接过程.也就是说,不必调用 listen() 和 accept() ...

  2. Python中的端口协议之基于UDP协议的通信传输

    阅读目录 UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较) 3.利用socketserver模块实现udp传输协议的并发通 ...

  3. java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端

    //郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...

  4. 网络编程——TFTP协议(基于UDP)

    目录 1. tftp协议概述 2. tftp下载模型 3. tftp协议分析 代码 1. tftp协议概述 简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输 特点: 是应用层 ...

  5. TFTP协议(基于UDP)

    一.TFTP简介 TFTP:简单文件传送协议,最初用于引导无盘系统,被设计用来传输小文件 特点: 基于UDP协议实现不进行用户有效性认证 数据传输模式: octet:二进制模式netascii:文本模 ...

  6. java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些java方面的技术应用. 今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆. ...

  7. 用python建云盘_实用的Python(3)超简单!基于Python搭建个人“云盘”

    1 简介 当我们想要从本地向云服务器上传文件时,比较常用的有pscp等工具,但避免不了每次上传都要写若干重复的代码,而笔者最近发现的一个基于Python的工具updog,可以帮助我们在服务器上搭建类似 ...

  8. python documents in chinese_基于 Python 的简单自然语言处理实践

    基于 Python 的简单自然语言处理 Twenty News Group 语料集处理 20 Newsgroup 数据集包含了约 20000 篇来自于不同的新闻组的文档,最早由 Ken Lang 搜集 ...

  9. python识别ppt文件格式 ——(专栏:基于python编写简单office阅卷程序③)

    ● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享. ○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可. ____Ⓙ即刻@王昭没有君 本文仅为笔者摸索总结-欢迎订正 ...

最新文章

  1. 机器学习——XGBoost大杀器,XGBoost模型原理,XGBoost参数含义
  2. 连夜撸了一个简易聊天室
  3. easyUI与选择WebUI
  4. 南召天气预报软件测试,南召天气预报15天
  5. Struts2入门这一篇就够了
  6. 操作系统c语言两个进程制约且互斥,电大计算机本科《操作系统》作业2及答案...
  7. 【Java】6.3 类成员
  8. 033-Unit 12 Introduction to String Processiong
  9. E1 PCM设备的主要特点介绍
  10. 补丁程序正在运行_针对微软4月14日更新补丁会导致蓝屏问题的检测及解决方法...
  11. Written English-书面-一般现在时
  12. 场景文字识别的算法创新与应用,来自百度的技术前沿
  13. python里面的数学
  14. Excel 作复合饼图和双轴柱形图
  15. monit监控mysql_monit监控工具(客户端)
  16. 指数基金之父Bogle为指数基金敲响了警钟
  17. 超声成像发射声场仿真(Ultrasound Emit Field Simulation)
  18. 戴维斯计算机科学值得读吗,2018加州大学戴维斯分校计算机科学专业基本信息详细解读...
  19. GPIO output level 和 GPIO Pull-up/Pull-down的区别
  20. 怎么在手机上照证件照,原来可以很简单

热门文章

  1. [国嵌攻略][038][时钟初始化]
  2. jquery easyui Tab 引入页面的问题
  3. 重写GridView支持数据筛选和自动排序功能
  4. Linq(筛选与排序)
  5. socket编程(二) select 模型
  6. C++提高部分_C++普通函数与函数模板调用规则---C++语言工作笔记085
  7. Vue过滤器_使用过滤器进行数据格式化操作---vue工作笔记0015
  8. 大数据之-Hadoop_1.x和2.x区别---大数据之hadoop工作笔记0012
  9. 微服务升级_SpringCloud Alibaba工作笔记0002---理解反应式编程中的背压(Backpressure)机_流的逆向压力
  10. URL转码escape() encodeURI() encodeURIComponent()