socket傳送文件
阿新 • • 發佈:2017-10-29
結果 防止 字符 lap view data pla os.path 等待
一、文件傳送步驟
我們要利用socket來實現下載一個文件,該如何操作呢?
服務端:
- 讀取文件名
- 判斷文件是否存在
- 檢測文件大小(用於和客戶端對比判斷文件是否傳送完畢)
- 發送文件大小給客戶端
- 等待客戶端確認(防止粘包)
- 打開文件
- 邊讀邊發送數據
- md5驗證
客戶端:
- 發送命令
- 接收文件大小
- 返回確認
- 獲取文件名
- 對比文件大小
- 寫入文件
二、功能實現(ftp下載功能)
服務端:
# -*- coding: UTF-8 -*- import os import socket # TCP/IP協議, tcp ,如果不填寫就是默認這個 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((View Code‘localhost‘, 9999)) server.listen() while True: # 可以接受多個客戶端 conn, addr = server.accept() print(‘new conn‘, addr) while True: cmd_res = conn.recv(1024) if not cmd_res: # 防止當接受的客戶端數據為空時,程序卡掉 print(‘client has lost...‘) break else:# 獲取命令和文件名 cmd, filename = cmd_res.decode().split() print(cmd, filename) if os.path.isfile(filename): # 判斷文件是否存在 # 文件大小 file_size = os.stat(filename).st_size # 發送文件大小 conn.send(str(file_size).encode(‘utf-8‘)) # 等待客戶端確認 conn.recv(1024) # 打開文件 f = open(filename, ‘rb‘) for line in f: conn.send(line) f.close()
客戶端:
# -*- coding: UTF-8 -*- import socket client = socket.socket() client.connect((‘localhost‘, 9999)) while True: cmd = input(‘>>:‘).strip() # 判斷是否發送空數據,如果是就重新發送 if len(cmd) == 0: continue else: client.send(cmd.encode(‘utf-8‘)) # 獲取服務端發送的文件大小 size = client.recv(1024) total_file_size = int(size.decode()) # 返回確認 client.send(b‘file size received‘) filename = cmd.split()[1] print(filename) received_size = 0 # 寫入文件 f = open(filename + ‘.new‘, ‘w‘) while received_size < total_file_size: r_data = client.recv(1024) received_size += len(r_data) f.write(r_data.decode(‘gbk‘, ‘ignore‘) + ‘\n‘) else: print(‘file sizes‘, total_file_size, received_size) print(‘receive finished‘) f.close()View Code
運行結果:
這個程序有缺陷,首先目前只能讀取本文件夾下的文件,其次新生成的文件解碼後還是有部分中文字符亂碼,哎...
三、md5驗證文件
下周做了,,,
socket傳送文件