python用socket中的TCP\IP協議來傳輸文件


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值來判斷兩個文件是否一樣;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM