概述
1.从服务器上下载文件原理:当我们在浏览器/迅雷从服务器上下载文件时,它会在本地先建立一个文件,这个文件的名字跟想要下载的文件名字是一样的,然后从服务器读取到一点数据,就会write()到本地,一直这样循环,直至写完为止。
2.客户端发送下载文件请求:
1.创建套接字
2.链接服务器
3.发送下载文件请求
4.在本地创建一个文件名跟所要下载的文件名一样的文件
5.如果有数据,就创建新文件接收数据,否则,什么也不做
6.关闭
from socket import *
def main():
# 创建socket
tcp_client_socket = socket(AF_INET, 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)
# print('接收到的数据为:', recv_data.decode('utf-8'))
# 如果接收到数据再创建文件,否则不创建
if recv_data:
with open("[接收]"+file_name, "wb") as f:
f.write(recv_data)
# 关闭套接字
tcp_client_socket.close()
if __name__ == "__main__":
main()
用vi编辑的客户端代码:
1 from socket import *
2
3 def main():
4 txf=socket(AF_INET,SOCK_STREAM)
5
6 ti=input("请输入服务器ip地址:")
7 tport=int(input("请输入服务器端口地址:"))
8 tadr=(ti,tport)
9 txf.connect(tadr)
10
11 filename=input("请输入要下载的文件名:")
12 txf.send(filename.encode("gbk"))
13
14 rec_data=txf.recv(1024*1024)
15
16 if rec_data:
#为什么是“wb”,因为rec_data就是二进制格式,用了“wb”,所以就不需要在前面为rec_data进行解码了。
17 with open(filename,"wb") as f:
18 f.write(rec_data)
19 txf.close()
20
21
22 if __name__=="__main__":
23 main()
3.服务器传数据
1.socket创建一个套接字
2.bind绑定自己的ip和port
3.listen使套接字变为可以被动链接
4.accept等待客户端的链接
5.recv接收客户端发来的下载文件请求
6.读取数据
7.发送数据
8.关闭两个套接字。
vi编辑器程序:
1 from socket import *
2
3 def send_file_2_client(new_client_socket,client_adr):
4 file_name=new_client_socket.recv(1024).decode("utf- 8")
5 print("客户端(%s)所要下载的文件是%s:"%(client_adr,f ile_name))
6
7 content=None
8 #这里不能用with打开一个文件,因为你不知道服务器有没有该文件,with是在已有文件前提下,不会报错。
9 try:
10 f=open(file_name,"rb")
11 content=f.read()
12 f.close()
13 except Exception as ret:
14 print("打不开此文件%s:"%file_name)
15
16 if content:
17 new_client_socket.send(content)
18
19 def main():
20
21 srr=socket(AF_INET,SOCK_STREAM)
22
23 srr.bind(("",8795))
24
25 srr.listen(128)
26
27 while True:
28 print("等待一个新的客户端程序:")
29 new_client_socket,client_adr=srr.accept()
30 send_file_2_client(new_client_socket,client_adr )
31 new_client_socket.close()
32 srr.close()
33
34
35 if __name__=="__main__":
36 main()
最后
以上就是大意香氛为你收集整理的TCP下载文件的全部内容,希望文章能够帮你解决TCP下载文件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复