2016-11-26 5 views
0

クライアントからサーバーへファイルを転送する簡単なファイル転送プログラムを実行したい。サーバーはクライアントにパスを送信し、クライアントはファイルをサーバーに送信します。しかし、私はサーバーの部分でファイルを作成する方法を知らない。実際には、すべてのファイルをバイナリモードで送信しますが、それ以降はサーバーモードですべてのバイトを受信します。受信するバイトからファイルを作成する方法はわかりません。クライアントから受信バイト後にファイルを作成する

クライアント部分

sock = 0 
path = " " 


def open_socket(): 
    global sock 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.connect(("localhost", 9000)) 


def transfer_file(path): 
    f = open(path, "rb").read() 
    sock.send(f) 


def main(): 
    open_socket() 
    path = sock.recv(1024) 



if __name__ == "__main__": 
    main() 

サーバーパート

def open_connection(): 
    global client 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.bind(("0.0.0.0", 9000)) 
    sock.listen(1) 
    client, address = sock.accept() 


def file_transfer(): 
    path = raw_input("Enter path of file: ") 
    client.send(path) 
    while True: 
     file_from_client = client.recv(1024) 


def main(): 
    open_connection() 
    file_transfer() 



if __name__ == "__main__": 
    main() 

感謝します!

+0

:これは、1つのファイルを転送しますサーバーにファイルを送信しますか? [コード例を使用して、ファブリックを使用してssh経由でローカルファイルをアップロードする方法](http://stackoverflow.com/q/5314711/4279) – jfs

答えて

1

sendallの代わりにsend(フルバッファ未満を送信する可能性があります)を使用し、読み取り側がデータの送信が完了したことを知る方法を理解するなど、ソケットでもう少し作業が必要です。複数のファイルを要求するメッセージ境界がないので、私の例ではソケットを閉じ、相手側に転送が完了したことを知らせます。私もグローバル変数を取り除いた。送信するには、httpまたはSFTPまたは他の既存のプロトコルを使用しない何らかの理由がある

client.py

import socket 

def open_socket(): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.connect(("localhost", 9000)) 
    return sock 

def transfer_file(sock, path): 
    f = open(path, "rb").read() 
    sock.sendall(f) 

def main(): 
    sock = open_socket() 
    path = sock.recv(1024) 
    transfer_file(sock, path) 
    sock.shutdown(socket.SHUT_RDWR) 
    sock.close() 

if __name__ == "__main__": 
    main() 

server.py

import socket 
import os 

def open_connection(): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    sock.bind(("0.0.0.0", 9000)) 
    sock.listen(1) 
    client, address = sock.accept() 
    sock.close() 
    return client 

def file_transfer(client): 
    path = raw_input("Enter path of file on client: ") 
    local_path = os.path.join(os.getcwd(), os.path.basename(path)) 
    print 'will write to local file', local_path 
    client.send(path) 
    with open(local_path + '.tmp', 'wb') as outfile: 
     while True: 
      block = client.recv(1024) 
      if not block: 
       break 
      outfile.write(block) 
    os.rename(local_path + '.tmp', local_path) 
    print 'wrote', os.stat(local_path).st_size, 'bytes' 

def main(): 
    client = open_connection() 
    file_transfer(client) 
    client.close() 



if __name__ == "__main__": 
    main() 
関連する問題