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实现HTTP协议下的文件下载方法总结
Apr 20 Python
利用Python进行异常值分析实例代码
Dec 07 Python
python 接口返回的json字符串实例
Mar 27 Python
pytorch训练imagenet分类的方法
Jul 27 Python
Windows下安装Scrapy
Oct 17 Python
python3.6利用pyinstall打包py为exe的操作实例
Oct 31 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
django修改models重建数据库的操作
Mar 31 Python
python实现飞船大战
Apr 24 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
Aug 05 Python
python3实现名片管理系统(控制台版)
Nov 29 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
PHP使用JSON和将json还原成数组
2015/02/12 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
PDO::getAttribute讲解
2019/01/28 PHP
Jquery 弹出层插件实现代码
2009/10/24 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
2019/09/10 Javascript
JavaScript如何操作css
2020/10/24 Javascript
[01:14:34]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第一局
2016/02/28 DOTA
Python的设计模式编程入门指南
2015/04/02 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
详解python的数字类型变量与其方法
2016/11/20 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
python3.7添加dlib模块的方法
2020/07/01 Python
python爬虫分布式获取数据的实例方法
2020/11/26 Python
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
自我鉴定书面格式
2014/01/13 职场文书
高中生期末评语大全
2014/01/28 职场文书
40岁生日感言
2014/02/15 职场文书
法律进机关实施方案
2014/03/12 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript