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 相关文章推荐
使用PyInstaller将Python程序文件转换为可执行程序文件
Jul 08 Python
python数据结构之链表详解
Sep 12 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
pyqt5简介及安装方法介绍
Jan 31 Python
flask框架中勾子函数的使用详解
Aug 01 Python
用Python实现BP神经网络(附代码)
Jul 10 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
Mar 03 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
Aug 30 Python
尝试使用Python爬取城市租房信息
Apr 12 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
2010年最佳jQuery插件整理
2010/12/06 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
2016/02/29 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
2017/03/02 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
python目录与文件名操作例子
2016/08/28 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
详解Python_shutil模块
2019/03/15 Python
Python3中的bytes和str类型详解
2019/05/02 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
Python图像读写方法对比
2020/11/16 Python
公务员培训心得体会
2013/12/28 职场文书
授权委托书格式
2014/07/31 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
退学证明范本3篇
2014/10/29 职场文书
教师节表彰会主持词
2015/07/06 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
java泛型通配符详解
2021/07/25 Java/Android
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript