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安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
Apr 27 Python
python3操作mysql数据库的方法
Jun 23 Python
Python实现的凯撒密码算法示例
Apr 12 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
Feb 28 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
Python使用requests模块爬取百度翻译
Aug 25 Python
python实现自动打卡的示例代码
Oct 10 Python
Python3压缩和解压缩实现代码
Mar 01 Python
python中requests库+xpath+lxml简单使用
Apr 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获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
原生js开发的日历插件
2017/02/04 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
基于jQuery.i18n实现web前端的国际化
2018/05/04 jQuery
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
在vue中获取token,并将token写进header的方法
2018/09/26 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
python实现nao机器人手臂动作控制
2019/04/29 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
Django models filter筛选条件详解
2020/03/16 Python
python实现三种随机请求头方式
2021/01/05 Python
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
mysql有关权限的表都有哪几个
2015/04/22 面试题
新员工欢迎词
2014/01/12 职场文书
镇创先争优活动总结
2014/08/28 职场文书
六年级学生期末评语
2014/12/26 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
闪闪红星观后感
2015/06/08 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android