2016-05-15 12 views
1

私は接続をすぐに終了するとうまく動作するソケットを介してファイルを送信しようとしています アップロードが完了した後でもサーバーにコマンドを送信し続けたいのですがサーバーは、単にそれらを無視して、ファイルPythonがソケットを介してファイルを送信する

ここに私のコードは、これまで 、クライアントのために来てより多くの行があると考えている:

def client_sender(): 
    global upload 
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    try: 
     print target 
     print port 
     client.connect((target, port)) 

     if upload: 
      with open(upload_destination, "rb") as f: 
       for line in f: 
        client.send(line) 
      f.close() 
      client.send("DONE\r\n") 
      upload = False 

     print client.recv(1024) 
     buffer = "" 
     buffer = sys.stdin.read() 
#... some code for sending commands and receiving a response 

サーバー:

def handle_client(client_socket): 
    global upload 
    print "Client connected" 
    if upload: 
     file_buffer = "" 
     while True: 
      data = client_socket.recv(1024) 
      if data.rstrip() == "DONE": 
       break 
      file_buffer += data 
     try: 
      file_descriptor = open(upload_destination, 'wb') 
      file_descriptor.write(file_buffer) 
      file_descriptor.close() 

      client_socket.send("Successfully placed the file in %s" %upload_destination) 
     except: 
      client_socket.send("Failed writing to the file") 

     upload = False 
#... same as client, just some more code for commands 
は、
+1

ファイルに 'DONE'が含まれていると何が起こるのか興味深いでしょう。 – mhawke

+0

これは、私が書いたコンパイル済みのCプログラムを転送するためのもので、逆効果がない方法はありません – Aginu

答えて

3

の値をdata = client_socket.recv(1024) の後に印刷してみると、おそらく"endofthefile\nDONE\r\n"と表示されます。

これでrstripを実行すると、"endofthefile\nDONE"となり、"DONE"と等しくなりません。

あなたは、このようなあなたのwhileループを書き換える必要があります。

while True: 
     data = client_socket.recv(1024) 
     for line in data.split('\n'): 
      if data.rstrip() == "DONE": 
       break 
      file_buffer += line + '\n' 

ます。また、最後の発表のために、クライアント側でこれを使用することもできます。client.sendall("DONE\r\n")を。 sendallは、同じパケットでさらに多くのデータが送信されるのを待つ代わりに、クライアントのバッファをただちにフラッシュします。


オフトピックですが、あなたのプロトコルを変更することをお勧めします。ファイルにDONE行が含まれていれば動作しません。そのようなサーバー上の行を分割することは不十分です。 より良い方法は、クライアントがファイルのサイズをアナウンスしてから送信することです。これにより、サーバーはいつ読み込みを停止するかを正確に知ることができます。

+0

あなたのコード例を試しましたが、実際に問題を解決していません しかし、かなり良いので、私はそれを試してみましょう!どうもありがとうございました! – Aginu

関連する問題