仅用学习参考

实战功能需求

使用python编写客户端以及服务端读取、下载文件的功能。

客户端:请求需要下载的文件名,然后从服务端根据返回的数据,写成一个文件
服务端:根据客户端发送过来的需要下载的文件名,返回该文件的内容数据

版本1.0 - 客户端首先从网络调试器中读取返回的数据,生成文件

客户端代码如下:

[root@server01 tcp_download]# vim client.py #coding=utf-8from socket import *# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)# 服务器的地址
dest_addr = ('192.168.1.2', 8080)  # 注意 是元组,ip是字符串,端口是数字# 链接服务器,进行tcp三次握手
tcp_client_socket.connect(dest_addr)# 从键盘获取数据
download_file_name = input("胖子老板:你想要上面烟呀")# 发送数据到指定的服务端
tcp_client_socket.send(download_file_name.encode("utf-8"))# 接收对方发送过来的数据,最大接收1024个字节, 1024 = 1K , 1024*1024 = 1M , 1024*1024*1024 = 1G
recvData = tcp_client_socket.recv(1024)
print('server:',str(recvData.decode('utf-8')))# 将受到的数据保存到一个文件中,"wb"以字节写入文件
with open("download_" + download_file_name,"wb") as f:f.write(recvData)# 关闭套接字
tcp_client_socket.close()

执行如下:

可以看到,现在已经简单实现了客户端的功能了,那么下面来实现一下服务端的功能。

版本 1.1 - 客户端向服务端发送文件名,服务端简单返回“蓝利群一包”,然后客户端将内容写入文件中

服务端的返回代码如下:

[root@server01 tcp_download]# vim server.py #coding=utf-8from socket import *# 创建套接字
tcp_server_socket = socket(AF_INET, SOCK_STREAM)# 绑定服务端提供服务的端口号
local_addr = ('', 7788) #  ip地址和端口号,ip一般不用写,表示本机的任何一个ip# 绑定
tcp_server_socket.bind(local_addr)# 使用socket创建的套接字默认的属性是主动的,使用listen将其改为被动,用来监听连接
tcp_server_socket.listen(128)while True:# 如果有新的客户端来链接服务端,那么就产生一个新的套接字专门为这个客户端服务# client_socket用来为这个客户端服务# tcp_server_socket就可以省下来专门等待其他新的客户端连接while True:client_socket, clientAddr = tcp_server_socket.accept()# 接收对方发送的数据recv_data = client_socket.recv(1024) #  1024表示本次接收的最大字节数if recv_data:print('接收到的数据为:',recv_data.decode('utf-8'))# 发送一些数据到客户端client_socket.send("yours lanliqun !".encode('utf-8'))# 将接收到的数据转换为字符串打印recv_result = str(recv_data.decode('utf-8'))print("recv_result",recv_result)# 关闭为这个客户端服务的套接字,只要关闭,就意味着不能再为这个客户端服务了。# 如果客户端还需要服务,则重新建立连接client_socket.close()### 最后关闭监听的socket
tcp_server_socket.close()

执行如下:

好了,写到这里。已经看到客户端已经将服务端返回的文件内容都写入文件了。
也简单实现了服务端的功能。
那么下一步就是要求服务端可以根据请求的文件名读取内容,然后返回给客户端文件内容了。

版本 2.0 - 服务端读取一个文件的内容,返回客户端

首先准备好一个准备被下载的文件:

[root@server01 tcp_download]# echo 123 > 1.txt
[root@server01 tcp_download]# ls
1.txt  client.py  download_lanliqun  server.py
[root@server01 tcp_download]#
[root@server01 tcp_download]# cat 1.txt
123
[root@server01 tcp_download]#

等会有客户端请求需要下载1.txt文件,然后服务端返回1.txt的文件内容,提供客户端下载。

服务端代码如下:

[root@server01 tcp_download]# vim server.py #coding=utf-8from socket import *def send_file_2_client(client_socket,clientAddr):# 接收从客户端需要下载的文件名recv_data = client_socket.recv(1024) #  1024表示本次接收的最大字节数if recv_data:file_name = recv_data.decode('utf-8')print('need to download file_name= %s' % file_name)print('client IP:',clientAddr)# 根据文件名读取文件数据,并返回文件内容file_content = None# 打开文件try:f = open(file_name,"rb")file_content = f.read()f.close()except Exception as ret:print("don't have download file %s" % file_name)# 发送打开的文件内容到客户端if file_content:#client_socket.send("yours lanliqun !".encode('utf-8'))client_socket.send(file_content)def main():# 创建套接字tcp_server_socket = socket(AF_INET, SOCK_STREAM)# 绑定服务端提供服务的端口号local_addr = ('', 7788) #  ip地址和端口号,ip一般不用写,表示本机的任何一个ip# 绑定tcp_server_socket.bind(local_addr)# 使用socket创建的套接字默认的属性是主动的,使用listen将其改为被动,用来监听连接tcp_server_socket.listen(128) # 128 可以理解服务器可以同时监听128个客户端while True:# 如果有新的客户端来链接服务端,那么就产生一个新的套接字专门为这个客户端服务# client_socket用来为这个客户端服务# tcp_server_socket就可以省下来专门等待其他新的客户端连接while True:client_socket, clientAddr = tcp_server_socket.accept()# 读取并发送文件内容到客户端        send_file_2_client(client_socket,clientAddr)# 关闭为这个客户端服务的套接字,只要关闭,就意味着不能再为这个客户端服务了。# 如果客户端还需要服务,则重新建立连接client_socket.close()## 最后关闭监听的sockettcp_server_socket.close()if __name__ == "__main__":main()

演示执行如下:

从演示中看出,客户端存在一个bug,当服务端返回空字符串的时候,客户端照样会写入一个空内容到文件中。
那么下面改改就好,加一个判断。
客户端代码如下:

[root@server01 tcp_download]# vim client.py #coding=utf-8from socket import *# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)# 服务器的地址
dest_addr = ('127.0.0.1', 7788)  # 注意 是元组,ip是字符串,端口是数字# 链接服务器,进行tcp三次握手
tcp_client_socket.connect(dest_addr)# 从键盘获取数据
download_file_name = input("胖子老板:你想要上面烟呀")# 发送数据到指定的服务端
tcp_client_socket.send(download_file_name.encode("utf-8"))# 接收对方发送过来的数据,最大接收1024个字节, 1024 = 1K , 1024*1024 = 1M , 1024*1024*1024 = 1G
recvData = tcp_client_socket.recv(1024)
print('server:',str(recvData.decode('utf-8')))# 当服务端返回有数据,才写入文件中
if recvData:# 将受到的数据保存到一个文件中,"wb"以字节写入文件with open("download_" + download_file_name,"wb") as f:f.write(recvData)# 关闭套接字
tcp_client_socket.close()

执行演示如下:

关注微信公众号,回复【资料】、Python、PHP、JAVA、web,则可获得Python、PHP、JAVA、前端等视频资料。

Python 实战:文件下载功能相关推荐

  1. python语言type board_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题……...

    针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...

  2. 客户信贷评级 Python 实战

    作者 | 萝卜 来源 | 早起Python(ID:zaoqi-python) 前言 大样本的数据集固然提供了丰富的信息,但也在一定程度上增加了问题的复杂性.如果我们分别对每个指标进行分析,往往得到的结 ...

  3. python wx窗口无法关闭_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题…...

    针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...

  4. python项目归纳总结-这4个Python实战项目,让你瞬间读懂Python!

    原标题:这4个Python实战项目,让你瞬间读懂Python! 来自:https://www.toutiao.com/a6593456515221291528/ Python 是一种极具可读性和通用性 ...

  5. python爬虫教程下载-Python爬虫文件下载图文教程

    而今天我们要说的内容是:如果在网页中存在文件资源,如:图片,电影,文档等.怎样通过Python爬虫把这些资源下载下来. 1.怎样在网上找资源: 就是百度图片为例,当你如下图在百度图片里搜索一个主题时, ...

  6. python有趣的小项目-有趣的十个Python实战项目,让你瞬间爱上Python!

    前言 Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Pytho ...

  7. 原创:centos7.1下 ZooKeeper 集群安装配置+Python实战范例

    centos7.1下 ZooKeeper 集群安装配置+Python实战范例 下载:http://apache.fayea.com/zookeeper/zookeeper-3.4.9/zookeepe ...

  8. Spring Boot入门(11)实现文件下载功能

      在这篇博客中,我们将展示如何在Spring Boot中实现文件的下载功能.   还是遵循笔者写博客的一贯风格,简单又不失详细,实用又能让你学会.   本次建立的Spring Boot项目的主要功能 ...

  9. python项目实战干货_干货 | 这4个Python实战项目,让你瞬间读懂Python!

    Python是一种极具可读性和通用性的编程语言.Python这个名字的灵感来自于英国喜剧团体Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Python易于设置, ...

  10. python字典获取关联值_【Python实战12】使用字典关联数据

    现在我的手里有了新的一组数据,数据内容如下: james.txt: James Lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22,2 ...

最新文章

  1. web开发过程中经常用到的一些公共方法及操作
  2. SpringBoot+Vue 完整的外卖系统,手机端和后台管理,可以玩一下!
  3. Python数据分析·读取CSV文件转为字典
  4. cdn节点人少延迟高_如何正确配置CDN高速缓存,避免越用越慢的尴尬
  5. 01 - java 开始
  6. java beetl 视频_04.Beetl常用内置函数以及安全输出---《Beetl视频课程》
  7. Civil3D二次开发Cookbook
  8. 全景视频拼接(一)--关键技术流程
  9. 【Python】Centos + gunicorn+flask 报错ImportError: No module named request
  10. uni-app实现上传照片和个人信息
  11. Elasticsearch相关操作梳理
  12. Oracle中space什么意思,Oracle中shrink space命令详解
  13. 传统文化之广场舞乱相到底反映出中国社会怎样的深层次矛盾
  14. 任正非带队访问上海交大,高手的逻辑有什么不同
  15. 聚能聊每周精选 第十九期
  16. 26、vue前端出现跨域问题,如何解决跨域?
  17. 丁华锋 机器人_国家重点研发计划“智能机器人”项目在西安交大启动
  18. ps4登陆原神显示无法登陆服务器,首页_原神PS4和PC手机数据互通_原神PC和手机数据互通吗_3DM网游...
  19. 服务器管理工具--小骑士
  20. 多亏这份《秋招+金九银十-腾讯面试题合集》跳槽薪资翻倍!全网最新

热门文章

  1. 让物体绕固定点做圆周运动 让物体到达目的点
  2. 服务器系统共享打不开怎么办,服务器共享打不开
  3. 数据库系统原理大作业——自行车出租
  4. 转载:平面点集凸壳算法大全(英文)
  5. python两个二维数组加法_python中利用numpy.array()实现俩个数值列表的对应相加方法...
  6. 【vulnhub】【DC系列】DC6 - WordPress Active monitor靶机
  7. Windows 10 Creators Update 正式版全集 下载链接
  8. Linux系统学习关于权限的命令
  9. Object 3Tier Infoworks (简称 O3W)
  10. 2022年889计算机技术专业基础综合整理