簡體   English   中英

簡單的Python Server客戶端文件傳輸

[英]Simple Python Server Client File Transfer

我正在進行這個簡單的python服務器-客戶端文件傳輸項目。 每側有兩個部分。 首先,客戶端將文件發送到服務器的第一部分。 然后,服務器添加一行並將文件發送回第二部分。

我的問題是,由於某種原因,每當我有返回文件代碼時,服務器代碼就會停留在接收狀態。 如果我要注釋掉代碼的第二部分,則服務器將接收客戶端發送的所有文件。 否則,它將在接收時凍結。 是的,客戶確實發送了它。

您可以忽略所有打印命令,只是在那里查看問題所在。

servercode:

import socket

ssFT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssFT.bind((socket.gethostname(), 8756))
ssFT.listen(1)
while True:
    (conn, address) = ssFT.accept()
    text_file = 'fileProj.txt'

    #Receive, output and save file
    with open(text_file, "wb") as fw:
        print("Receiving..")
        while True:
            print('receiving')
            data = conn.recv(1024)
            print('Received: ', data.decode('utf-8'))
            if not data:
                print('Breaking from file write')
                break
            fw.write(data)
            print('Wrote to file', data.decode('utf-8'))
        fw.close()
        print("Received..")

    #Append and send file
    print('Opening file ', text_file)
    with open(text_file, 'ab+') as fa:
        print('Opened file')
        print("Appending string to file.")
        string = b"Append this to file."
        fa.write(string)
        fa.seek(0, 0)
        print("Sending file.")
        while True:
            data = fa.read(1024)
            conn.send(data)
            if not data:
                break
        fa.close()
        print("Sent file.")
    break
ssFT.close()

客戶代碼:

 import socket

csFT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
csFT.connect((socket.gethostname(), 8756))

text_file = 'passphrase.txt'

#Send file
with open(text_file, 'rb') as fs: 
    #Using with, no file close is necessary, 
    #with automatically handles file close
    while True:
        data = fs.read(1024)
        print('Sending data', data.decode('utf-8'))
        csFT.send(data)
        print('Sent data', data.decode('utf-8'))
        if not data:
            print('Breaking from sending data')
            break
    fs.close()

#Receive file
print("Receiving..")
with open(text_file, 'wb') as fw:
    while True:
        data = csFT.recv(1024)
        if not data:
            break
        fw.write(data)
    fw.close()
print("Received..")

csFT.close()

我使用Python 3在本地測試了您的代碼。

我看到的問題是服務器代碼中的conn.recv 由於conn.recv阻止了連接,因此它正在等待更多數據。

我發現的解決方案是向服務器發送命令,以通知數據傳輸的BEGIN和END,如下所示:

client.py

#Send file
with open(text_file, 'rb') as fs: 
    #Using with, no file close is necessary, 
    #with automatically handles file close
    csFT.send(b'BEGIN')
    while True:
        data = fs.read(1024)
        print('Sending data', data.decode('utf-8'))
        csFT.send(data)
        print('Sent data', data.decode('utf-8'))
        if not data:
            print('Breaking from sending data')
            break
    csFT.send(b'ENDED') # I used the same size of the BEGIN token
    fs.close()

server.py

with open(text_file, "wb") as fw:
    print("Receiving..")
    while True:
        print('receiving')
        data = conn.recv(32)
        if data == b'BEGIN':
            continue
        elif data == b'ENDED':
            print('Breaking from file write')
            break
        else:
            print('Received: ', data.decode('utf-8'))
            fw.write(data)
            print('Wrote to file', data.decode('utf-8'))
    fw.close()
    print("Received..")

Client.py完整代碼: https ://pastebin.com/LySsgEe4

Server.py完整代碼: https ://pastebin.com/KADZpqkM

希望對您有所幫助!

我解決此問題的方法是先發送文件大小,然后服務器在收到整個文件后就可以立即停止等待。 我不知道是否有更好的解決方案,但這就像一個魅力:

BUFFER_SIZE = 1024

client.py

import os
fsize = os.path.getsize(text_file)
csFT.send(str(fsize).encode('utf-8'))

with open(text_file, 'rb') as fs:
    data = fs.read(BUFFER_SIZE)
    while data:
        csFT.send(data)
        data = fs.read(BUFFER_SIZE)

server.py

with open(text_file, 'wb') as fw:
    msg = ssFT.recv(BUFFER_SIZE)
    fsize = int(msg.decode('utf-8'))
    rsize = 0

    while True:
        data = ssFT.recv(BUFFER_SIZE)
        rsize = rsize + len(data)
        fw.write(data)
        if  rsize >= fsize:
            print('Breaking from file write')
            break

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM