2016-05-06 4 views
0

こんにちは私は、ファイルを転送するために、Pythonでソケットを使ってクライアントとサーバーアーキテクチャを作っています。 Ubuntuでは、Ubuntuではエラーはありませんが、ファイル全体が送信されていません。私が4MBの音楽ファイルを送信しようとすると、50〜60kbしか転送されず、Windowsでは300MBのファイルも完全に送信されます。ここに私のコードです。ソケットを使ったPythonでのファイル転送

のClient

def sendFile(self): 
    # ''' Print a language constructed from 
    #  the selections made by the user. ''' 
    # print('%s!' % (self.recipient.displayText())) 
    client_socket.send("upload") 
    time.sleep(1) 
    client_socket.send(self.virtual_os[self.os_box.currentIndex()].title()) 
    time.sleep(1) 
    path = self.recipient.displayText() #inputbox which contains the path of the file 
    self.recipient.setText('') 
    name = path.split('/') 
    name = name[len(name)-1] 
    print "Opening file - ",name 
    client_socket.send(name) 
    time.sleep(1) 
    fp = open(path,'rb') 
    data = fp.read() 
    fp.close() 
    size = os.path.getsize(path) 
    size = str(size) 
    client_socket.send(size) 
    time.sleep(1) 
    client_socket.send(data) 
    print "Data sent successfully" 

サーバー -

choice = client_socket.recv(1024) 
if(choice == "upload"): 
    virtual_os = client_socket.recv(1024) 
    print virtual_os 
    fname = client_socket.recv(1024) 
    print "recieved file "+fname 
    size = client_socket.recv(1024) 
    size = int(size) 
    print "The file size is - ",size," bytes" 
    size = size*2 
    strng = client_socket.recv(size) 
    fp = open(fname,'wb') 
    fp.write(strng) 
    fp.close() 
    print "Data Received successfully" 

私のコードに問題があるのか​​、私はそれがUbuntuの上で動作させるために何かを変えなければならないのですか?

+0

なぜあなただ​​けの代わりに '' os.path.getsize() 'の' lenを(データ)を使用していないから、例の一つで、次の得ましたか。 –

+0

os.path.getsize()は、サイズを印刷して正しいサイズを出力するのでうまく動作しますが、len(data)も使用してみました。そして、この問題はUbuntuでしかない。どういうわけか、データの一部だけが送信されます。 –

答えて

0

時々、データは小さな断片にチャンクされ、一度にすべてではなく複数のセグメントでネットワークインターフェイスを介して送信されます。基本的には、ネットワーク接続を閉じる前にメッセージ全体が表示されません。受信したデータがあるかどうかをチェックする(つまり、データのサイズが0であるかどうかを確認するwhileループを追加する)必要があります。私は公式のPythonページhttps://docs.python.org/2/library/socket.html#example

# Echo server program 
import socket 

HOST = '' 
PORT = 50007 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
conn, addr = s.accept() 
print 'Connected by', addr 
while 1: 
    data = conn.recv(1024) 
    if not data: break 
    conn.sendall(data) 
conn.close() 
+0

私もこれを試しました!私の主な関心事は、同じコードがWindows上で動作しているのであれば、それはなぜubuntuで動作していないのですか? –

+0

あなたのテストでループバックインターフェイス(つまり、 '' localhost''または '' 127.0.0.1'')を使用しましたか?ループバックを送信する際には、データを格納するためにバッファを "拡張"するなどの複雑な処理があります(ただし、私にはそれを引用しないでください)。いずれにせよ、wiresharkまたはtcpdumpを使用して何が起きているのかを確認する必要があります。 Windowsでは、wiresharkはw/localhostで動作しません。 –

関連する問題