2016-07-18 16 views
0

TCPソケットを使用して大きなリストを受け取る最も良い方法はどれですか?TCPソケット経由で大きなリストを受け取る -

私のコードは次のようになっています。 Uが大きなリストを受け取る必要がある場合、それは明らかに機能しません。

print 'connection from', client_address 
    while True: 
     try: 
      data = pickle.loads(connection.recv(8192)) 
     except EOFError: 
      print 'no more data from', client_address 
      break 
+0

なぜ機能しないのですか?一度に8192バイトを要求することでデータをチャンクしています。これはまあまあですが、とにかくできることはおそらく最高です。あなたはどんな改善を望んでいますか? –

+0

'pickle'は安全ではないことに注意してください。***明示的に***あなたのソースを信用しないと、' json.load'が良いオプションになるかもしれません。 –

+0

@AkshatMahajan本当に大きなリストでは機能しません。リストの文字列または項目を取得せず、リスト自体を取得します。 – K09

答えて

0

これを行うための最善の方法は、fileオブジェクトにsocketを変換することです。 connection.makefile()でこれを行うことができます。次に、pickledオブジェクト全体を含む完全なバイト文字列を必要とするpickle.loads()を呼び出すのではなく、pickle.load(connection.makefile())を呼び出します。このようにして、pickleモジュールが "ファイル"全体を読み取るようにします。すべての期待されるデータを受け取るまで、オブジェクトのread関数を繰り返し呼び出します。

これは基本的に、ストリームの残りの部分全体がアンピケッとされていることを前提としています(あなたがしようとしているように見えるので、うまくいくはずです)。それ以外の場合は、ピクルスオブジェクトの末尾について何らかの独立した知識を持つストリームの周りに独自の擬似ファイルオブジェクトをラップする必要があります。

+0

それは素晴らしいです!ありがとうございました :) – K09

関連する問題