TCP套接字是面向鏈接、基於流(stream)的套接字,數據收發無邊界。send
調用後數據移動至輸出緩衝,recv
調用瞬間,從輸入緩衝讀取數據。具備一下特性:python
使用TCP完成數據的上傳和下載服務器
(1) 準備:併發
文件夾中新建四個txt文件,1.txt、2.txt、3.txt、4.txtsocket
(2) 編寫TCP客戶端程序,code
① TCP的客戶端具備的功能:輸入 文件的名字,發送到服務器 實現文件的下載server
② 客戶端接收服務器端返回的數據進行判斷,若是是 標識: error,提示用戶文件不存在,不然將數據保存到本地ip
(3) 編寫服務端程序utf-8
① 接收客戶端的消息,根據客戶端發來的文件名,從桌面的info文件夾中讀取相應的文件內容返回給客戶端input
② 若是要下載的文件不存在,則返回 標識: errorit
import socket # 建立並鏈接 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(('localhost', 6060)) # 輸入併發送文件名 filename = input('Enter the file name you want to download:') client.send(filename.encode('utf-8')) # 接受判斷標識 recv_content = client.recv(1024).decode('utf-8') if recv_content == 'error': print(f'there is no {filename}.') elif recv_content == 'Ready to download': print(recv_content) # 使用循環從輸入緩衝中讀取並保存文件 while True: recv_data = client.recv(1024) if recv_data: with open(filename,'ab') as f_obj: f_obj.write(recv_data) else: print('Down completely') break client.close()
import socket # 建立並接受鏈接 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,True) server.bind(('192.168.43.112', 6060)) server.listen(128) client_service, client_ip_port = server.accept() print(f'{client_ip_port} is connected') # 接受文件名並按路徑打開 recv_data = client_service.recv(1024) filename = recv_data.decode('utf-8') dirc = "C:\\Users\\wz2310\\Desktop\\info\\" try: f = open(dirc+filename,'rb') except Exception as error: print(error) # 文件不存在返回錯誤 client_service.send('error'.encode('utf-8')) else: # 文件存在先返回提示再發送文件 client_service.send('Ready to download'.encode('utf-8')) send_data = f.read() print(len(send_data)) client_service.send(send_data) f.close() client_service.close() server.close()