ps: 下面两个版本全部是 基于 tcp协议完成的.

简单版(无注释):

  服务器(server)代码:

from socket import socket
sk = socket()
sk.bind(('127.0.0.1', 8585))
sk.listen()def display(): return '1, 上传\n2, 下载'def upload(word,chose_path):# chose_path = input('>>>请输入要上传的文件路径:')with open(chose_path.decode('utf-8'), 'wb') as f:f.write(word)def download():name = '__init__.py'with open(name, 'rb') as f:word = f.read()return name.encode('utf-8'), worddef main():while 1:conn, addr = sk.accept()while 1:conn.send(display().encode('utf-8'))msg_r = conn.recv(1024).decode('utf-8')if msg_r == 'q':continueif msg_r == '1':word = conn.recv(1024*10)chose_path = conn.recv(1024 * 10)upload(word, chose_path)conn.send('上传成功'.encode('utf-8'))elif msg_r == '2':name, word = download()conn.send(name)conn.send(word)main()

  客户端(client) 代码:

from socket import socketsk = socket()
sk.connect(('127.0.0.1', 8585))
flag = Truedef upload():chose_path = input('>>>请输入要上传的文件路径:')with open(chose_path, 'rb') as f:word = f.read()return chose_path.encode('utf-8'), worddef download(name, word):with open(name,'wb') as f:f.write(word)return '下载成功'def main():global flagmsg_r = sk.recv(1024).decode('utf-8')print(msg_r)choise = input('>>>请选择功能ID(输入"q"退出程序):').strip().encode('utf-8')sk.send(choise)if choise == 'q'.encode('utf-8'): flag = Falseif choise == '1'.encode('utf-8'):chose_path, word = upload()sk.send(word)sk.send(chose_path)print(sk.recv(1024).decode('utf-8'))elif choise == '2'.encode('utf-8'):name = sk.recv(1024).decode('utf-8')word = sk.recv(1024)print(download(name, word))while flag:main()
sk.close()

  

升级版 (有注释,此程序会出现个别粘包现象):

  服务器(server):

from socket import socket
import os
import picklesk = socket()
sk.bind(('127.0.0.1', 8589))
sk.listen()def display(): return '1, 上传\n2, 下载'     #  此函数用来发送第一个选择def update(name): # 更名chose = conn.recv(1024).decode('utf-8')  # 接收客户的选择if chose == '1':pass   # 如果选择 1 覆盖 则不用操作elif chose == '2':      # 如果选择 2 更改 接收客户端的消息name = conn.recv(1024).decode('utf-8')      #  新文件的名字return namedef upload(word,chose_path):    # 上传函数chose_path = chose_path.decode('utf-8')  # 把接收的文件名 解码# 判断 该文件 是否已经存在与 服务器 当前工作目录下:if chose_path in os.listdir('E:/老男孩工具/13期课后作业及视频/day33/myself_test/new_upload_download/updata_server_path'):    # 路径 按照自己的文件夹来自定义# 如果在, 向客户端发消息, 并且询问 用户的选择conn.send('服务器已存在该文件:选择覆盖还是更名:\n1, 覆盖\n2, 更名'.encode('utf-8'))name = update(chose_path)     # 调用 update() 更改函数 获得新文件的名字 或 老文件的名字if not name:chose_path = name  # 如果 name 不为None  给文件进行改名:with open(chose_path, 'wb') as f:  # 打开文件 进行写入f.write(word)def download(): # 下载# 把服务器工作目录下 所有文件 装到列表里path_list = os.listdir(r'E:\老男孩工具\13期课后作业及视频\day33\myself_test\new_upload_download\updata_server_path')lis = [{x:y} for x,y in enumerate(path_list,1)] # 生成一个 有序的元素为字典的 内容列表pic = pickle.dumps(lis)    # 序列化一下conn.send(pic)          # 发送给 客户端, 然后询问 客户要下载那个文件的idfile_id = conn.recv(1024).decode('utf-8')  #   接收到 idname = lis[int(file_id)-1][int(file_id)]    # 取得 相对应的文件名with open(name, 'rb') as f:         # 打开文件, 读到内容word = f.read()return name.encode('utf-8'), word    # 返回文件名字, 和 内容def main(): ## 服务器while 1:conn.send(display().encode('utf-8'))  # 发送 第一条消息:  '1, 上传\n2, 下载'msg_r = conn.recv(1024).decode('utf-8') #  接收 客户端的选择信息if msg_r == 'q':break               # 如果是q 退出程序if msg_r == '1':                # 如果 选择 1  此时需要在客户端 向用户索要 文件信息.word = conn.recv(1024*10)    # 接收 文件内容chose_path = conn.recv(1024 * 10)   #   接收文件名字upload(word, chose_path)        # 调用上传 函数 并且把文件内容 和名字 传进去conn.send('上传成功'.encode('utf-8'))   # 如果程序成功运行到了这里 就把消息发过去.elif msg_r == '2':              # 如果选择2 下载name, word = download()     # 调用 下载函数 download() 把返回值 分别 赋值 name, wordconn.send(name)                # 发送 文件名字.conn.send(word)         # 最后一条消息: 文件内容returnif __name__ == '__main__':while 1:conn, addr = sk.accept()main()conn.close()

  客户端(client) 代码:

import pickle
from socket import socket
import ossk = socket()
sk.connect(('127.0.0.1', 8589))
flag = Truedef upload():chose_path = input('>>>请输入要上传的文件路径:')with open(chose_path, 'rb') as f:word = f.read()                         #  读取文件内容chose_path = os.path.basename(chose_path)   # 取得 路径的 文件名return chose_path.encode('utf-8'), word    # 把word  name  返回def download(name, word):path = input('>>>请选择工作路径:')new_path = os.path.join(path, name)with open(new_path,'wb') as f:f.write(word)return '下载成功'def update(): # 更名chose = input('>>>请输入您的选择:').strip().encode('utf-8')sk.send(chose) # 把选择发给 服务器, 让服务器做判断if chose == '1'.encode('utf-8'):pass   # 如果是1 则不作任何操作elif chose == '2'.encode('utf-8'):      # 如果是2 则更名new_name = input('>>>请输入新的名字:').encode('utf-8')sk.send(new_name)        # 把新名字 给服务器 发过去print(sk.recv(1024).decode('utf-8')) # 接收 服务器 发送的 成功的消息 并且打印出来def main():   # 客户端global flagmsg_r = sk.recv(1024).decode('utf-8')   #  接收第一条消息,   '1, 上传\n2, 下载'print(msg_r)choise = input('>>>请选择功能ID(输入"q"退出程序):').strip().encode('utf-8')sk.send(choise)  # 把 客户选择的功能发送给 服务器if choise == 'q'.encode('utf-8'): flag = Falseif choise == '1'.encode('utf-8'):chose_path, word = upload()  # 调用upload() 上传函数  返回 word 和 文件名sk.send(word) #         把 word发送给服务器sk.send(chose_path) #       把文件名发送给 服务器ret = sk.recv(1024).decode('utf-8')     # 接收 服务器传输过来的 判断是否 存在的语句print(ret)if ret == '服务器已存在该文件:选择覆盖还是更名:\n1, 覆盖\n2, 更名':      # 如果是这句话就 调用下面的函数, 如果不是这句话 会打印 上传成功update()   # 此函数的功能 和 服务器里面的 功能一样 :更名elif choise == '2'.encode('utf-8'):    # 当选择 2 下载 时pic = pickle.loads(sk.recv(1024))     #  把服务器发来的 pickle 字典 反序列化了print('下面是所有子文件:')for i in pic:print(i)                        #  一个一个打印出来file_id = input('>>>请输入想要下载的文件的ID:').strip().encode('utf-8')sk.send(file_id)                    # 把 id 发给 服务器name = sk.recv(1024).decode('utf-8')   # 接收 服务器发来的 文件的名字word = sk.recv(1024*1000)   #  最后一条消息: 接收文件名download(name, word)         # 此函数 是用来把内容写入新文件print('下载成功')if __name__ == '__main__':while flag:main()sk.close()

  

转载于:https://www.cnblogs.com/123zzy/p/9512117.html

基于 tcp协议完成的上传下载相关推荐

  1. 基于TCP协议的文件上传与下载

    一.前言 TCP协议:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793 定义.传输控制 ...

  2. TCP文件上传Java_java 基于TCP协议的文件上传

    参考文档 1.https://www.sxt.cn/Java_jQuery_in_action/ten-filebytestream.html 2.https://www.sxt.cn/Java_jQ ...

  3. 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现

    文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...

  4. 基于FTP协议实现文件上传与下载

    目录 一.FTP简介 二.关于FTP服务器 三.文件上传 分步讲解: 完整实现代码: 四.下载文件 分步讲解: 完整实现代码: 小结 一.FTP简介 FTP(File Transfer Protoco ...

  5. [转]文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1

    转自:http://blog.csdn.net/soarheaven/archive/2008/12/08/3474152.aspx 最近项目需要对FTP服务器进行操作,现把实现总结如下: 打算分2篇 ...

  6. Microsoft .NET Framework 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1...

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  7. python实现TCP远程服务器文件上传,下载系统

    TCP服务器代码如下: from socket import *def client_upload(client_socket):"""上传数据""& ...

  8. 【Java课程设计】仿QQ多人聊天室(基于TCP协议与JavaSwing)附下载

    仿QQ多人聊天室 下载地址:链接:https://pan.baidu.com/s/1dLFjSxwTA4gL5lI0B4UGuQ  提取码:2qs0 有两个项目,分别是服务器chatterServer ...

  9. [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器...

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

最新文章

  1. Hinton 发表新作探索流体胶囊网络 | AI日报
  2. python常见函数
  3. jmeter制造大批量的用户数据数据
  4. c语言最大公约数和最小公倍数_五年级奥数课堂之七:公因数和公倍数
  5. 笔记本电脑如何保养_电脑保养只是吹一吹?别再被骗了,电脑没做这些就等于没保养...
  6. Mysql 添加用户 授权等操作
  7. LeetCode(349)——两个数组的交集(JavaScript)
  8. JAVA各类基础高级面试题和中间件面试题资料
  9. python 生成式 生成器
  10. 2021泰迪杯数据分析技能赛A题:Python实现通讯产品销售和盈利能力分析(含原始数据)
  11. kubespray安装高可用k8s集群
  12. Leetcode 1324. Print Words Vertically
  13. linux远程利用漏洞CVE-2016-4484 93次空密码重试就可以获得root权限 影响大多数Linux版本...
  14. 论文解读:Missing data imputation with adversarially-trained graph convolutional network
  15. 2022年中国总体健康指数为66.6%,已连续四年持续稳步上升,工作健康指数提升最为显著 | 美通社头条...
  16. 仿滴滴打车时间选择器开始结束时间
  17. html长图转换成pdf,支持把各类文档转换成 HTML5(SVG)接口、长图片、PDF 。word转pdf、word转html5、pdf转网页html5、pdf转图片的接口...
  18. STM32C8T6编码器电机测速与arduino光电模块测速
  19. 推荐 5 款私藏的优质 Chrome 插件
  20. 研究生带28岁腼腆导师一起相亲?被女生围追堵截要微信!

热门文章

  1. WebView 上传文件 WebChromeClient之openFileChooser函数
  2. 截取视图某一段另存为部分视图(Partial View)
  3. stm32内部的CAN总线
  4. 删除作业计划出错(DELETE语句与 REFERENCE约束FK_subplan_job_id冲突。)
  5. Java里边什么是值传递和引用传递?两个有什么区别
  6. 爬虫9-淘宝商品信息定向爬虫
  7. Linux 安装composer
  8. curl抓取页面时遇到重定向的解决方法(转)
  9. 基于KNN的相关内容推荐
  10. 让wordpress首页不显示指定分类文章