python能夠用socket來模擬FTP模式傳輸文件,只需在客戶端指明需要傳輸的文件名和地址,便能夠實現文件傳輸,代碼如下:
服務器端:
#-*- coding:utf-8 -*- """ __author__ = BlingBling 建立TCP的基本流程 ss = socket() # 創建服務器套接字 ss.bind() # 套接字與地址綁定 ss.listen() # 監聽連接 inf_loop: # 服務器無限循環 cs = ss.accept() # 接受客戶端連接 comm_loop: # 通信循環 cs.recv()/cs.send() # 對話(接收/發送) cs.close() # 關閉客戶端套接字 ss.close() # 關閉服務器套接字#(可選) """ #!/usr/bin/env python import os from socket import * from time import ctime HOST = '' #對bind()方法的標識,表示可以使用任何可用的地址 PORT = 21567 #設置端口 BUFSIZ = 1024 #設置緩存區的大小 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) #定義了一個套接字 tcpSerSock.bind(ADDR) #綁定地址 tcpSerSock.listen(5) #規定傳入連接請求的最大數,異步的時候適用 while True: print('waiting for connection...') tcpCliSock, addr = tcpSerSock.accept() print ('...connected from:', addr) while True: data = tcpCliSock.recv(BUFSIZ) print("recv:",data.decode("utf-8")) if not data: break filename = data.decode("utf-8") if os.path.exists(filename): filesize = str(os.path.getsize(filename)) print("文件大小為:",filesize) tcpCliSock.send(filesize.encode()) data = tcpCliSock.recv(BUFSIZ) #掛起服務器發送,確保客戶端單獨收到文件大小數據,避免粘包 print("開始發送") f = open(filename, "rb") for line in f: tcpCliSock.send(line) else: tcpCliSock.send("0001".encode()) #如果文件不存在,那么就返回該代碼 tcpCliSock.close() tcpSerSock.close()
客戶端,接收文件:
#-*- coding:utf-8 -*- """ __author__ = BlingBling """ #!/usr/bin/env python from socket import * HOST = 'localhost' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) while True: message = input('> ') if not message: break tcpCliSock.send(bytes(message, 'utf-8')) data = tcpCliSock.recv(BUFSIZ) if not data: break if data.decode() == "0001": print("Sorr file %s not found"%message) else: tcpCliSock.send("File size received".encode()) file_total_size = int(data.decode()) received_size = 0 f = open("new" + message ,"wb") while received_size < file_total_size: data = tcpCliSock.recv(BUFSIZ) f.write(data) received_size += len(data) print("已接收:",received_size) f.close() print("receive done",file_total_size," ",received_size) tcpCliSock.close()
該代碼只是在最后通過比較兩個文件的大小來判斷文件是否傳輸完畢,可以考慮在傳輸完之后比較兩個文件的MD5值來判斷兩個文件是否一樣;
