使用TCP编写一个文件下载器,分为客户端和服务器,此博客为上一篇的延伸,增加了文件读写编程。
下载器服务器程序:
import socket
def send_file_client(new_client_socket, client_addr):
# 1.接受客户端发过来的文件名
file_name=new_client_socket.recv(1024).decode("utf-8")
print("客户端发下载的文件名:%s"%str(file_name))
# 2.打开这个文件,读取数据
file_content=None
try:
f=open(file_name,"rb")
file_content=f.read()
f.close()
except Exception as ret:
print("没有要下载的文件:%s"% file_name)
#3.回送一数据给客户端
if file_content:
new_client_socket.send(file_content)
def main():
# 创建套接字
tcp_sever_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定本地信息
tcp_sever_socket.bind(('',7890))
# 让默认是套接字主动变为被动(listen)
tcp_sever_socket.listen(128)
while True:
# 等待客户端的链接
print("等待新的客户端到来")
new_client_socket,client_addr=tcp_sever_socket.accept() # 服务套接字
print("客户端已经到来:%s"%str(client_addr))
# 调用发送文件函数
send_file_client(new_client_socket,client_addr)
# 关闭套接字
new_client_socket.close()
print("已经为这个客户端服务完毕")
tcp_sever_socket.close()
if __name__ == '__main__':
main()
下载器客户端程序:
import socket
def main():
# 1.创建套接字
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.获取服务器ip,port
dest_ip=input("输入下载服务器的IP:")
dest_port=int(input("输入下载服务器的port:"))
# 3.连接服务器
tcp_socket.connect((dest_ip,dest_port))
# 4.获取下载的文件名字
download_file=input("输入下载文件的名字:")
# 5.将下载的文件名字发送到服务器
tcp_socket.send(download_file.encode("utf-8"))
# 6.接受文件中的数据
recv_data=tcp_socket.recv(1024*1024)
if recv_data:
# 7.保存接收到的数据到文件中
with open("new"+download_file,"wb") as f:
f.write(recv_data)
# 8.关闭套接字
tcp_socket.close()
if __name__ == '__main__':
main()