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实现baidu hi自动登录的代码
Feb 10 Python
python使用paramiko模块实现ssh远程登陆上传文件并执行
Jan 27 Python
Python time模块详解(常用函数实例讲解,非常好)
Apr 24 Python
在Python的setuptools框架下生成egg的教程
Apr 13 Python
python实现自动更换ip的方法
May 05 Python
浅谈python对象数据的读写权限
Sep 12 Python
python负载均衡的简单实现方法
Feb 04 Python
对python中dict和json的区别详解
Dec 18 Python
实例讲解Python中整数的最大值输出
Mar 17 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
详解python程序中的多任务
Sep 16 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 传值赋值与引用赋值的区别
2010/12/29 PHP
Laravel路由设定和子路由设定实例分析
2016/03/30 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
js相册效果代码(点击创建即可)
2013/04/16 Javascript
jQuery阻止事件冒泡具体实现
2013/10/11 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
全系IE支持Bootstrap的解决方法
2015/10/19 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
vue源码入口文件分析(推荐)
2018/01/30 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
2018/08/08 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
MockJs结合json-server模拟后台数据
2020/08/26 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
2019/12/29 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
应聘自荐书
2013/10/08 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
产品委托授权书范本
2014/09/16 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
毕业横幅标语
2014/10/08 职场文书
基于Nginx实现限制某IP短时间访问次数
2021/03/31 Servers
python删除csv文件的行列
2021/04/06 Python
pytorch 中nn.Dropout的使用说明
2021/05/20 Python
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android
Python中的嵌套循环详情
2022/03/23 Python