思路 :
1. tcp收发信息要有一个客户端 和 服务端. 客户端向服务器发送信息,然后服务器给客户端回复 .
2.下载文件其实就是 服务器按照服务端发过来的文件名 找到文件, 把文件内容读出来回复给客户端
ps:如果不了解tcp的基本收发信息步骤来看这个: 链接: tcp收发信息
一 我们现在写一个客户端:
import socket
# 1初始化套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置地址可以复用,解决了 端口没有及时释放的问题
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 连接服务器
tcp_socket.connect(('192.168.198.131', 11000))
file_name = input('请输入要下载的文件名字')
# 发送文件名字
tcp_socket.send(file_name.encode('utf-8'))
while True:
# 接收文件的内容
recv_data = tcp_socket.recv(2048)
if recv_data:
with open('[下载的]' + file_name, 'ab') as file:
file.write(recv_data)
else:
# 接收完 停止循环
break
# 5断开
tcp_socket.close()
2 在写一个服务器端的:
import socket
# 1初始化套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置地址可以复用,解决了 端口没有及时释放的问题
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2 服务器绑定ip和port
tcp_socket.bind(('192.168.198.131', 11000))
# 3 设置为被动监听模式 最大并发接收的数量是128
tcp_socket.listen(128)
while True:
# 4 等待接收链接请求 接收到一个元组 (客户端的socket对象,(客户端的地址,端口))
client, addr = tcp_socket.accept()
print('client:', client)
print('addr:', addr)
data = client.recv(1024)
# 获取要下载的文件的名字
file_name = data.decode('gbk')
print('请求下载的文件是:%s' % file_name)
try:
# 以二进制的形式读取内容 使用with as打开文件 不用手动关闭文件了
with open(file_name, 'rb') as file:
content = file.read()
except:
print('文件不存在')
# 发送
client.send(content)
# 关闭
client.close()
# 5断开
tcp_socket.close()