• PUDN用户
    了解作者
  • Python
    开发工具
  • 4KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 0
    下载次数
  • 2019-04-02 21:35
    上传日期
利用多线程的机制,来实现tftp服务器同时进行上传和下载功能。
Desktop.zip
  • download.py
    3KB
  • upload.py
    2.6KB
  • fwq.py
    4KB
内容介绍
#coding=utf-8 # 导包 import sys import struct from socket import * from threading import Thread ''' 利用多线程的机制,来实现tftp服务器同时进行上传和下载功能。 ''' # 客户端上传线程 def upload_thread(fileName, clientInfo): "负责处理客户端上传文件" fileNum = 0 #表示接收文件的序号 # 以二进制方式打开文件 f = open(fileName, 'wb') # 创建UDP套接字 s = socket(AF_INET, SOCK_DGRAM) # 打包 sendDataFirst = struct.pack("!HH", 4, fileNum) # 回复客户端上传请求 s.sendto(sendDataFirst, clientInfo) #第一次用随机端口发送 while True: # 接收客户端发送的数据 responseData = s.recvfrom(1024) #第二次客户连接我随机端口 # print(responseData) recvData, clientInfo = responseData #print(recvData, clientInfo) # 解包 packetOpt = struct.unpack("!H", recvData[:2]) #操作码 packetNum = struct.unpack("!H", recvData[2:4]) #块编号 #print(packetOpt, packetNum) # 客户端上传数据 if packetOpt[0] == 3 and packetNum[0] == fileNum: # 保存数据到文件中 f.write(recvData[4:]) # 打包 sendData = struct.pack("!HH", 4, fileNum) # 回复客户端ACK信号 s.sendto(sendData, clientInfo) #第二次用随机端口发 fileNum += 1 if len(recvData) < 516: print("用户"+str(clientInfo), end='') print(':上传'+fileName+'文件完成!') break # 关闭文件 f.close() # 关闭UDP套接字 s.close() # 退出上传线程 exit() # 客户端下载线程 def download_thread(fileName, clientInfo): "负责处理客户端下载文件" # 创建UDP套接字 s = socket(AF_INET, SOCK_DGRAM) fileNum = 0 #表示接收文件的序号 try: f = open(fileName,'rb') except: # 打包 errorData = struct.pack('!HHHb', 5, 5, 5, fileNum) # 发送错误信息 s.sendto(errorData, clientInfo) #文件不存在时发送 exit() #退出下载线程 while True: # 从本地服务器中读取文件内容512字节 readFileData = f.read(512) fileNum += 1 # 打包 sendData = struct.pack('!HH', 3, fileNum) + readFileData # 向客户端发送文件数据 s.sendto(sendData, clientInfo) #数据第一次发送 if len(sendData) < 516: print("用户"+str(clientInfo), end='') print(':下载'+fileName+'文件完成!') break # 第二次接收数据 responseData = s.recvfrom(1024) # print(responseData) recvData, clientInfo = responseData #print(recvData, clientInfo) #解包 packetOpt = struct.unpack("!H", recvData[:2]) #操作码 packetNum = struct.unpack("!H", recvData[2:4]) #块编号 #print(packetOpt, packetNum) if packetOpt[0] != 4 or packetNum[0] != fileNum: print("文件传输错误!") break # 关闭文件 f.close() # 关闭UDP套接字 s.close() # 退出下载线程 exit() # main函数 def main(): # 创建UDP套接字 s = socket(AF_INET, SOCK_DGRAM) # 解决重复绑定端口 s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # 绑定任意IP,端口号69 s.bind(('', 69)) print("tftp服务器成功启动!") print("正在运行中...") while True: # 接收客户端发送的消息 recvData, clientInfo = s.recvfrom(1024) # 第一次客户连接69端口 #print(clientInfo) # 解包 if struct.unpack('!b5sb', recvData[-7:]) == (0, b'octet', 0): opcode = struct.unpack('!H',recvData[:2]) # 操作码 fileName = recvData[2:-7].decode('gb2312') # 文件名 # 请求下载 if opcode[0] == 1: t = Thread(target=download_thread, args=(fileName, clientInfo)) t.start() # 启动下载线程 # 请求上传 elif opcode[0] == 2: t = Thread(target=upload_thread, args=(fileName, clientInfo)) t.start() # 启动上传线程 # 关闭UDP套接字 s.close() # 调用main函数 if __name__ == '__main__': main()
评论
    相关推荐
    • WinCE5.0_developer_guide_CN.rar
      WinCE5.0_developer__guide_CN.rar,wince开发手册,用于PDA等嵌入式硬件的操作系统开发
    • WinCE.zip
      jz4750上的wince开发手册 能够 在j4750上开发wince
    • android从bootloader到launcher启动流程整理
      讲述android 开机流程 从boot rom---bootloader---init--zygote---systemserver---ams 并附上自己整理的每个流程的流程图 ,清晰熟悉android 启动流程
    • 基于python开发的全国新工商采集工具 v1.2版本
      这个软件是通过scrapy爬虫框架结合代理IP池再加上request模拟请求技术以及验证码识别技术,可以做到日更新采集全国新工商信息。采集的数据自动存储在mysql数据库表里,可下载全量1.8亿多企业工商基本信息和36维度的详细信息.支持sql和excel导出数据包格式。
    • 卷积神经网络
      这是卷积神经网络的一个实际用例,已经调试好了,能够在matlab上成功运行,适合从事卷积神经网络(CNN)研究的人员学习使用。
    • OFDM的MATLAB仿真
      1.使用Matlab实现一个OFDM系统。 OFDM系统具体参数参照LTE标准,具体为: 系统带宽:5MHz; OFDM符号长度:0.0714ms; 子载波间隔:15kHz; CP长度:OFDM符号长度的7 ; FFT点数:512; 2.选择一种降低OFDM系统峰均比的算法,在1的基础上实现,并分析其性能。
    • matlab匹配滤波代码-matlab_for_thesis:Matlab博士学位论文代码
      matlab匹配滤波代码博士论文的MATLAB代码 博士论文的MATLAB代码的一部分,“井田双色散水下声通道中的多载波通信”。 函数下的func_JingTian文件夹 FUNC_JINGTIAN包含多载波通信中一些通常需要的功能: OFDM调制/解调模块,包括几种数据辅助的信道估计方法和差分解调; 快速实现GFDM和C-FBMC调制/解调,分别包括时域和频域的迫零(ZF)和匹配滤波(MF)均衡; 为OFDM信道估计中使用的压缩感测方法计算字典的功能; 增加信道效应,施加宽带多普勒失真的功能; 通过线性调频Z变换(CZT)以任意精度对频域中的信号进行重采样; Hermite函数合成的信号之间的交叉歧义函数的计算。 演示文件夹 以下列出了四个演示 demo1:使用基本追踪(BP)算法形式的压缩感知方法对OFDM进行稀疏2-D信道估计; demo2:比较基本数据辅助OFDM信道估计算法,包括常规频域插值和基于IDFT的变换域方法; demo3:圆形滤波器组多载波(C-FBMC / OQAM)的基于DFT特征向量的原型滤波器合成; demo4:用于广义频分复用(GFDM)的辅助日期辅助无干
    • PSCAD光伏模型 1MW
      通过PSCAD搭建的PV光伏模型,含MPPT最有功率寻找算法。
    • Wind-Energy-Prediction-using-LSTM:使用LSTM进行风能预测的时间序列分析
      使用长期短期记忆(LSTM)进行风能预测 有关完整的详细信息,请阅读CSE 523项目报告.pdf。 介绍 由于风速/功率具有可再生性和环境友好性,因此在地球上受到越来越多的关注。 随着全球风电装机容量的Swift增加,风电行业正在发展为大型企业。 可靠的短期风速预测在风能转换系统中起着至关重要的作用,例如风轮机的动态控制和电力系统调度。 精确的预测需要克服由于天气条件波动而导致的可变能源生产问题。 风产生的功率高度依赖于风速。 尽管它是高度非线性的,但风速在特定时间段内遵循特定模式。 我们利用这种时间序列模式来获得有用的信息,并将其用于功率预测。 LSTM用于对数据执行不同的实验并得出结论。 结论 我们的目标是改善对使用风能发电的功率的预测,并且已经实现了将LSTM用作机器学习模型并对其进行模型优化。 我们还观察到,如果风速小于4 m / s,则系统生成的功率为零。 LSTM无法学习这
    • Aerosim Blockset
      The AeroSim aeronautical simulation blockset provides a complete set of tools for the rapid development of nonlinear 6-degree of freedom aircraft dynamic models. In addition to the basic aircraft dynamics blocks, the library also includes complete aircraft models which can be customized through parameter files.