2017-02-27 5 views
1

私はクライアント/サーバーアプリケーションを持っており、非常に基本的です。クライアントは、サーバにファイル名を含む情報を含むメッセージを送信し、サーバは次にこのファイルをサーバディレクトリに作成し、クライアントが選択したファイルからすべてのバイナリデータをサーバ(およびサーバ新しく形成されたファイルに書き込む)。サーバーはこのファイルを実行し、すべての出力をクライアントに送り返す必要があります。私はこのデッドエンドを打ち、ループを維持するまでうまくいきました。ここでは、サーバー上のコードの簡易版です:このコードが実行されるたびPython - ソケットが奇妙に動作していますか?

if data_received.startswith("COMMAND:run_file"): #client tells server to create new file 
    #create file 
    while True: 
     #Get binary data from client 
     #If data is blank break 
     #Write data to new file 
    #Close file 
    #Open up new file using subprocess 
    p = Popen("python " + data[17:], shell=True,stdin=PIPE,stdout=PIPE,stderr=STDOUT) 
    print p.stdout.read() #Print output 

は今、サーバはクライアントのファイル罰金のバイナリデータを受信しますが、それはただ待っている...そこに座っます何か、それはクライアントから新しいコマンドを待っていない(私はこれを多く知っている)。私は混乱しているので、誰かが私がどこかで作った(おそらく)非常に明白な間違いを見つけられますか?

編集:
それが立ち往生した場合、私が発見した、それは今私は、なぜこれが立ち往生され見当もつかない

print p.stdout.read() 

後です。

+1

クライアントからバイナリデータを取得するのにどのようなコマンドを使用しますか? – Maaaaa

+0

クライアントはデータ 's.sendall(data)'を送り、サーバは 'conn.recv(1024)'を使ってデータを受け取ります –

+1

'data_recieved'をトレースすることをお勧めします。バイナリデータはあなたが思う長さではない可能性があります。あなたはPython 2またはPython 3ですか?バイトと文字列オブジェクトの違いのために問題になるかもしれません。 (また、おそらく無関係ですが、なぜあなたはシェルを使用していますか?) – cdarke

答えて

-1

conn.recv(1024)を使用すると、データを受信するまで待機します。そして真のループであるので、すべてのデータが送信された場合、(ブランクデータではなく)何も受信しない場合、データを受信しようとし続けます。したがって、「データが空白の場合」は決して真ではありません。

+0

ありがとうございます。だから、クライアントの 's.recv(1024)'はどうやって同じことをしないのでしょうか? –

+0

データを待つのはどういうことだと思いますか – Maaaaa

+0

この回答と混同しています: 'conn.recv(1024)'は質問のコードスニペットにどこに入りますか?または 's.recv(1024)'? – mguijarr

0

あなたが始めたサブプロセスがPythonの場合は、multiprocessingモジュールを使用することをお勧めします。

ご質問にお答えするには、stdoutがバッファされており、stdout.read()はサブプロセスが終了した場合にのみ返されます。

解決策は、stdout.read()の代わりにstdout.readline()を使用することです。 また、stderrを読んでいない場合はstderrPIPEにリダイレクトしないでください。