- 这里使用tcp协议实现一个文件下载器
众所周知,tcp是一个互联网传输协议,能够在不同电脑上对数据进行交换,这么我们就用tcp协议实现一个文件下载器功能。
程序分为两块,第一块为客户端,用户在客户端向服务器端请求需要下载的文件。然后把服务器端发送过来的文件保存起来。
import socket
def main():
# 创建套接字,这里创建的是tcp的套接字,和UDP不同的是SOCK_STREAM
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 获取服务器 ip port
server_ip = input("请输入服务器IP:")
server_port = int(input("请输入服务器端口:"))
server_addr = (server_ip,server_port)
# 链接服务器,这是tcp必须的,和服务器连接
tcp_socket.connect((server_addr))
# 获取下载文件名字
file_name = input("请输入需要下载的文件名字:")
# 发送文件名字给服务器
tcp_socket.send(file_name.encode("utf-8"))
# 接收文件数据
recv_data = tcp_socket.recv(1024)
# 保存接收的数据
with open("[新]" + file_name, 'wb') as f:
f.write(recv_data)
# 关闭套接字
tcp_socket.close()
print("下载完成")
if __name__ == "__main__":
main()
服务器端是来接收客服端的请求,把客户端需要的文件发送给它。
import socket
def write_to_file(new_socket,client_addr):
# 接收客户端需要下载的文件名
file_name = new_socket.recv(1024).decode("utf-8")
content = None
# 检查是否存在文件
try:
f = open(file_name,"rb")
content = f.read()
f.close()
except Exception as e:
print("没有这个文件")
# 发送数据给客户端,如果为空则不发送
if content:
new_socket.send(content)
def main():
# 创建套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定本地信息
tcp_socket.bind(("",7850))
# 保持监听
tcp_socket.listen(128)
while True:
# 等待客户端链接
new_client,client_addr = tcp_socket.accept()
# 写入文件
write_to_file(new_client,client_addr)
# 关闭套接字
new_client.close()
# 关闭套接字
tcp_socket.close()
if __name__ == "__main__":
main()
运行结果
tom@ubuntu:~/Desktop/socket$ python3 download_file.py
请输入服务器IP:192.168.137.137
请输入服务器端口:7850
请输入需要下载的文件名字:1122
下载完成
(base) tom@ubuntu:~/Desktop/socket$
这样一个简易的下载器就实现啦