文件下载利用 tcp原理
Ubuntu 20.04 python3.7
三个python文件 客户端.py 服务器.py 文件.py
客户端充当用户
服务器充当提供下载的服务端
客户端代码:
import socketdef main():# 创建套接字tcp_socket = socket.socket(socket.AF_INET,socket.SOCKET_STEAM)#获取服务器的ip和地址dest_ip = input("请输入服务器的ip: ")dest_port = input("请输入服务器的port:")#链接服务器tcp_socket.connect((dest_ip,dest_port))# 获取下载的文件名称download_file_name = input("请输入要下载的文件名称")# 将文件名称发送到服务器tcp_socket.send(download_file_name.encode('utf-8'))#接受文件中的数据recv_data = tcp_socket.recv(1024*1024)if recv_date:# 保存接收到的数据到一个文件中with open('下载内容' + download_file_name,'wb') as f:f.write( recv_data)# 关闭套接字tcp_socket.close()if __name__ == "main":main()
# 服务器端:
def send_file_client(new_client_socket,client_addr):#接收客户端法发来下载文件请求file_name = new_client_socket.recv(1024).decode('utf-8')#打印文件名称。print('客户端%s需要下载的文件名称是%s'%(str(client_addr),file_name))# 先定义content 为none 因为你不确定 有没有这个文件,假如没有# try 中包裹的可能发生异常的代码中 file_content 变量 如果没有文件 说明对象f 执行报错,f后面的#代码就不会被执行所以变量file_content 没有定义成功,那么在测试 if content : 是不是会报错啊#所以我在最好在前面定义它为空,即便在try 中 它存在数据,但是请你记得python 的执行流程 他会覆盖掉空#如果有则会判断有,如果没有 if file_content: 就会是noe,则不会向客户端会送数据,报出try 中没有文件的提示 不发送返回数据 关闭套接字#打开文件读取数据try:f = open(file_name,'rb')file_content = f.read()except Exception as ret:print("s%文件打开失败"% file_name)#发送输入给客户端# 如果打开 file_name 中存在数据将会给客户端返回收据if file_content:new_client_socket.send(file_content)def main():# 创建套接字tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)tcp_server_socket.bind(('',7788))#让默认的套接字由主动变为被动listentcp_server_socket.listen(256)while True:new_client_socket,client_addr = tcp_server_socket.accept()send_file_client(new_client_socket,client_addr)new_client_socket.close()# new_client_socket.close()只是关闭了为本次服务的套接字,等待开起下次服务tcp_server_socket.close()if __name__ == "__main__":main()
文件.python
cd 桌面/opt/
vim 客户端.py
将客户端中的代码写入其中
vim 服务器.py
将服务器端的代码写入其中
vim 文件.py
将“ 啊哈哈哈哈” 填入其中即可
当客户端向服务器发送下载文件.py的请求时,服务器会打开文件.py 这个文件 会读取里面的内容,将数据发送给客户端,客户端会创建一个 下载文件+ file_name文件 将传入的数据 '啊哈哈哈哈'写入到其中,保存起来
在结束完成交互后 通过命令执行 vim 下载文件文件.py 会发现刚才在服务器中打开的文件内容。
交互操作模拟了下载流程