4

Python でソケットを使用して単純なファイル転送を構築しようとしています。動けなくなり、ファイルの一部を送信できないようです。

いくつかのアドバイスに従って、ファイルの最後の行を送信しようとしたので、いつ接続を終了するかがわかります。

しかし、最初のパッケージを送信すると、クライアントが残りのパッケージを取得できないことがあります。

ここに私のコードが表示されます(サーバー側):

import os
import socket
PORT = 8080
HOST = 'localhost'
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind((HOST,PORT))
socket.listen(10)
conn, addr = socket.accept()
print '\033[46m\033[34m\033[1mBienvenido al File Sender v.0.02 hecho en Python. Este         programa permite enviar archivos a traves de tu maquina\033[0m'
ANSI_RED = '\033[31m'
ANSI_BLUE = '\033[34m'
ESCAPEANSI = '\033[0m'
def seleccion_path():
PATH = raw_input('\033[34m\033[1mSelect the Path (./ by default)').strip('n')
if PATH == '':
    PATH = os.getcwd()   
print PATH, ESCAPEANSI
acepta_path = raw_input('\033[34m\033[1mSi o No (S/N)').lower().strip(' ')
if acepta_path == 's' or acepta_path == 'si':
    return PATH
else:
    seleccion_path()
def filesDir(path):
files = os.listdir(PATH)
for fl in files:
    i = int(files.index(fl))+1
    print ANSI_RED + str(i)+ ')' + fl
return files

PATH = seleccion_path()
print 'el PATH seleccionado es:', PATH + '\n'
filesDir(PATH)
fileSelected = int(raw_input(ANSI_BLUE + 'Select a file with the number').strip(' ').lower()) 
print PATH + filesDir(PATH)[fileSelected-1]
fileToSend = open(PATH + filesDir(PATH)[fileSelected-1], 'rb')
qLines = len(open(PATH + filesDir(PATH)[fileSelected-1], 'rb').readlines())

finalLine = cpfileToSend.readlines()[qLines-1]
conn.send(finalLine)
while True:
    data = conn.sendall(fileToSend.readline())
    conf = conn.recv(1024)
    print conf
    if conf == 'OK':
        conn.close()
        fileToSend.close()
         break
print '\033[43m File sent'
#Finaliza el programa y deja los codigos ANSI cerrados
print ESCAPEANSI
exit()

クライアントは次のとおりです。

import os
import socket
PORT = 8080
HOST = 'localhost'

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect((HOST, PORT))
fname = open('./fileSent.pdf', 'w+')

finalLine = socket.recv(1024)
print finalLine
while True:
    strng = socket.recv(2048)
    print 'aaaaa',strng
    fname.write(strng)
    if finalLine in strng:
        fname.write(strng)
        socket.send('OK')
        socket.close()
fname.close()
print 'Data received correctly' 
exit()
4

2 に答える 2

1

readlines問題は、ファイルを開き、すべての行を ( で) 読み取ってから、ファイルを閉じずにもう一度読み取ろうとすることに起因しています。

ファイルの最後の行を最初に送信する理由について、@T_12 の懸念を共有します。ただし、そうする必要があると仮定すると、必要な修正は次のとおりです。

サーバーサイド コードのこの部分を置き換えます ( を定義した場所がわからないためcpfileToSend、 が意図されていたと思いますfileToSend)

fileToSend = open(PATH + filesDir(PATH)[fileSelected-1], 'rb')
qLines = len(open(PATH + filesDir(PATH)[fileSelected-1], 'rb').readlines())

finalLine = cpfileToSend.readlines()[qLines-1]
conn.send(finalLine)
while True:
    data = conn.sendall(fileToSend.readline())
    conf = conn.recv(1024)
    print conf
    if conf == 'OK':
        conn.close()
        fileToSend.close()
         break

これとともに

filepath = PATH + filesDir(PATH)[fileSelected-1]
fileToSend = open(filepath, 'rb')
qLines = len(open(PATH + filesDir(PATH)[fileSelected-1], 'rb').readlines())

finalLine = fileToSend.readlines()[qLines-1]
conn.send(finalLine)
fileToSend.close()
fileToSend = open(filepath, 'rb')
while True:
    data = conn.sendall(fileToSend.readline())
    conf = conn.recv(1024)
    print conf
    if conf == 'OK':
        conn.close()
        fileToSend.close()
         break

お役に立てれば

于 2013-01-27T01:57:36.523 に答える