python实现简单的tcp 文件下载


Posted in Python onSeptember 16, 2020

什么是下载?

首先客户端会问服务器,有没有一个xxx的文件啊?服务器开始寻找,找到后对客户端说有,然后客户端在本地新建一个文件,客户端从服务器收到一点数据,就写进这个文件中,再收到一点数据,再写入这个文件中,只要把所有的接收到的数据都写入到这个文件中,就完成了下载的操作。

所以下载需要2个部分。服务器的发送方和客户端的接收方。

我们这里不考虑复杂的情况。什么限速啊,验证啊,文件大小......只实现最简单的逻辑。

客户端参考代码

import socket

def main():

  # 创建socket
  tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  # 目的信息
  server_ip = input("请输入服务器ip:")
  server_port = int(input("请输入服务器port:"))

  # 链接服务器
  tcp_client_socket.connect((server_ip, server_port))

  # 输入需要下载的文件名
  file_name = input("请输入要下载的文件名:")

  # 发送文件下载请求
  tcp_client_socket.send(file_name.encode("utf-8"))

  # 接收对方发送过来的数据,最大接收1024个字节(1K)
  recv_data = tcp_client_socket.recv(1024)
  # 如果接收到数据再创建文件,否则不创建
  if recv_data:
    with open("[接收]"+file_name, "wb") as f:
      f.write(recv_data)

  # 关闭套接字
  tcp_client_socket.close()


if __name__ == "__main__":
  main()

服务端参考代码

import socket
import sys


def get_file_content(file_name):
  """获取文件的内容"""
  try:
    with open(file_name, "rb") as f:
      content = f.read()
    return content
  except:
    print("没有下载的文件:%s" % file_name)


def main():

  if len(sys.argv) != 2:
    print("请按照如下方式运行:python3 xxx.py 7890")
    return
  else:
    # 运行方式为python3 xxx.py 7890
    port = int(sys.argv[1])

  # 创建socket
  tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  # 本地信息
  address = ('', port)
  # 绑定本地信息
  tcp_server_socket.bind(address)
  # 将主动套接字变为被动套接字
  tcp_server_socket.listen(128)

  while True:
    # 等待客户端的链接,即为这个客户端发送文件
    client_socket, clientAddr = tcp_server_socket.accept()
    # 接收对方发送过来的数据
    recv_data = client_socket.recv(1024) # 接收1024个字节
    file_name = recv_data.decode("utf-8")
    print("对方请求下载的文件名为:%s" % file_name)
    file_content = get_file_content(file_name)
    # 发送文件的数据给客户端
    # 因为获取打开文件时是以rb方式打开,所以file_content中的数据已经是二进制的格式,因此不需要encode编码
    if file_content:
      client_socket.send(file_content)
    # 关闭这个套接字
    client_socket.close()

  # 关闭监听套接字
  tcp_server_socket.close()


if __name__ == "__main__":
  main()

以上就是python实现简单的tcp文件下载的详细内容,更多关于python tcp下载的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python生成随机密码或随机字符串的方法
Jul 03 Python
简单谈谈Python中函数的可变参数
Sep 02 Python
Python http接口自动化测试框架实现方法示例
Dec 06 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
Django Admin后台添加数据库视图过程解析
Apr 01 Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 Python
python爬虫中PhantomJS加载页面的实例方法
Nov 12 Python
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 Python
只用40行Python代码就能写出pdf转word小工具
May 31 Python
实现Python3数组旋转的3种算法实例
Sep 16 #Python
Python私有属性私有方法应用实例解析
Sep 15 #Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 #Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 #Python
pycharm激活方法到2099年(激活流程)
Sep 22 #Python
pycharm专业版远程登录服务器的详细教程
Sep 15 #Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 #Python
You might like
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
[01:50:49]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第三场 1月24日
2021/03/11 DOTA
python实现定制交互式命令行的方法
2014/07/03 Python
python中实现k-means聚类算法详解
2017/11/11 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
金山毒霸系列的笔试题
2013/04/13 面试题
Java如何支持I18N?
2016/10/31 面试题
大学生职业生涯规划书范文
2014/01/14 职场文书
家长学校实施方案
2014/03/15 职场文书
商务日语专业自荐信
2014/04/17 职场文书
小学生作文评语大全
2014/04/21 职场文书
党员公开承诺书内容
2014/05/20 职场文书
导游词之无锡梅园
2019/11/28 职场文书
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript