开发者学堂课程【Python入门 2020年版:文件下载案例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10464
文件下载案例
内容介绍
一. 原始代码
二. 说明
三. 最终代码
一.原始代码
1.文件下载客户端原始代码
import socket
s=socket.socket(socket.AF INET, socket.SOCK STREAM)
s.connect(('192.168.31.199'
,9090))
# s.send('hello'encode('utf8'))
file name=input('
清输入您要下载的文件名:") s.send(file name.encode('utf8'))
content=srecv(1024)decode('utf8')
//接收服务器返回的文件
with open(file name, 'w', encoding='utf8') as file:
file.write(content)
s.close()
说明:
发送与接收过程为客户端告诉服务器想要文件的名称,服务器读取到名称后将文件发送给客户端。
先写入 socket 后连接到端口号和 ip 地址,再用 s.send 发送消息启动文件下载服务器后文件下载服务器可以收到消息
用 content=srecv(1024)decode('utf8')接收服务器发送的文件
2.文件下载服务器原始代码
import socket
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(('192.168.31.199'
,9090)) server
server socket.listen(128)
#接收客户端的请求
client_socket,client_addr=server_socket.accept()
data=client_socket.recv(1024).decode('utf8')
if os.path.isfile(data):
#print('
读取文件,返回给客户端)
with open(data, 'r', encoding='utf8') as file:
//用 data 保存发送端想要文件的名称
content =file.read()
//读取文件
client socket.send(content.encode('utf8'))
//通过客户端的 socket 返回给客户端
else:
print('文件不存在')
说明:
首先写入 socket,绑定 ip 地址和和端口号,写入监听和接收客户端请求
二.说明
1.虚拟机作为客户端,windows 作为服务器,将 windows 中的文件 demo 下载到虚拟机中再用 client_socket.recv 读取数据
2.以上两段代码不能将图片打开,应该将所打开图片以二级制形式打开,并且加入读取网卡中字节的循环:
content =s.recv(1024)
if not content:
Break
3.代码运行过程
先输入要下载文件的名字,把文件名发给服务端,服务端接收之后通过 file.write(content )把内容写进来就完成了
4.不完善之处
在文件下载客户端中写入不存在的文件时,也能创建此文件,但此文件为空
三.最终代码(可以传送图片)
1.文件下载服务器最终代码
import socket
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(('192.168.31.199',9090)) server socket.listen(128)
#接收客户端的请求
client socket, client addr=server socket.accept()
data=client socket.recv(1024).decode('utf8')
print('
接收到了来自{}地址{}端口的数据,内容是:{}'.format(client addr[0], client addr[1],data))
if os.path.isfile(file name):
#print(读取文件,返回给客户端)
with open(file_name, 'rb') as file:
content =file.read()
client_socket.send(content)
else:
print('文件不存在')
2.文件下载客户端最终代码
import socket
s=socket.socket(socket.AF INET, socket.SOCK STREAM)
s.connect(('192.168.31.199',9090))
# s.send('hello'encode('utf8'))
file name=input("
清输入您要下载的文件名:)
s.send(file name.encode('utf8'))
with open(file name, 'wb')as file:
while True:
content =s.recv(1024)
if not content:
break
file.write(content )
s.close()