どのようにPythonのでバイナリデータを転送できますか?
-
13-09-2019 - |
質問
私が初めてクライアントサーバプログラムに取り組んでいる、と私は私がやっている何のために開始する場所にはなはだ不十分で感じてます。
私は Googleのプロトコルバッファは私のクライアントの間でバイナリデータを転送するを使用するつもりですそして私のサーバー。私は、Pythonのバリアントを使用しているつもりです。基本的な考え方は、私が理解し、クライアントは、データをシリアル化し、データをデシリアライズするサーバーにそれを送信することです。
問題は、私が実際にサーバにバイナリデータを送信するために開始する場所がわからないんだけど、あります。私はそれがHTTPリクエストのような「シンプル」なものになるだろうと期待していたが、私は、バイナリデータを転送する方法をGoogleの周りを検索してきたとチュートリアル、ガイドおよびドキュメントの広大な多数で迷子に。私は(私はそれを使用するために期待していたので、セキュリティが必要な場合、私はHTTPSにノッチをそれをノックすることができ)HTTP転送を調査することにより、間違ったツリーを吠えてる場合は私もわかりません。私は実際にも、ソケットプログラミングのレベルに行くためにしたくない - 私はそれに電源を入れる前に使用可能なライブラリを使用したいと思います。 (私が住んでいるよ、完璧なサードパーティのライブラリがあるかどうけれども、私はまた、標準のPythonライブラリを好むだろう。)
誰もが良い出発点を持っている(またはビット自分自身を説明したい)良い方法は、Python経由でバイナリデータを転送する方法についての場合は、だから、私は感謝されると思います。私が実行しているサーバーは、現在の方法で、mod_pythonのApacheとを実行されます。
解決
あなたが心に留めておくためにそこに他の物事のカップルに1つのシステムからのバイナリデータを移動しようとしている任意の時間ます。
別のマシンが異なり、同じ情報を格納します。これは、メモリ内に、ネットワーク上の両方の意味を持っています。ここでの詳細情報( http://en.wikipedia.org/wiki/Endiannessする)
あなたのpythonを使用しているので、あなたは(クライアントとサーバの両方によるPythonであろうと仮定して)ここにいくつかのたるみを自分でカットし、ちょうどあなたのデータをシリアル化するためにはcPickleを使用することができます。あなたが本当にバイナリたい場合は、Pythonの構造体モジュールで快適取得する必要があるとしている(ます。http: //docs.python.org/library/struct.htmlする)。そして、あなたのデータを解凍/パックする方法を学びます。
あなたはネットワーク通信の難しさを乗り越えるまで、私は最初のシンプルなラインプロトコルサーバから始めるでしょう。あなたはそれをやったことがない場合、それは非常に高速な混乱得ることができる前に。
...エラーなどで同期を再する方法、データを渡す方法、コマンドを発行する方法あなたはすでにクライアント/サーバプロトコルの設計の基本を知っている場合は、梱包を練習し、最初のディスク上のバイナリ構造を開梱。私はまた、このような場合のためにHTTPとFTPのRFCのを参照してください。
------- EDIT COMMENTに基づきます-------- 通常、この種のものは、サーバーにファイルのチェックサムだけでなく、ファイルのサイズ(バイト単位)を含む「ヘッダ」を送信することにより行われます。あなたが欲しいしかし、あなたはそれをカスタマイズすることができ、私はHTTPヘッダを意味するものではありませんので注意してください。一連の出来事は、このような何かを行く必要が...
CLIENT: "UPLOAD acbd18db4cc2f85cedef654fccc4a4d8 253521"
SERVER: "OK"
(server splits the text line to get the command, checksum, and size)
CLIENT: "010101101010101100010101010etc..." (up to 253521 bytes)
(server reasembles all received data into a file, then checksums it to make sure it matches the original)
SERVER: "YEP GOT IT"
CLIENT: "COOL CYA"
これは非常に簡易であるが、私はあなたが私がここで話しているかを見ることができると思います。
他のヒント
私は右のあなたの質問を持ってわからないんだけど、多分あなたは<ツイストプロジェクトを見てみることができます>。
あなたがFAQに見ることができるように、「ツイストは、多くのプロトコルをサポートする、Pythonで書かれたネットワーキング・エンジンである。これは、Webサーバが含まれている、数多くのチャットクライアント、チャットサーバ、メールサーバ、およびより多くの。ツイストは、で構成されて個別にアクセスすることができるサブプロジェクトの数[...]」
ドキュメントはかなり良いですし、インターネット上の例がたくさんあります。それがお役に立てば幸いです。
私はそれはあなたがGoogleのプロトコルバッファにどのように結びついによって異なり思いますが、あなたは <チェックアウトすることを好むかもしれません強い>スリフトのを。
のスリフトはのためのソフトウェアフレームワークのです スケーラブルなクロス言語サービス 開発。これは、ソフトウェアを組み合わせました コード生成エンジンへとスタック 効率的に作業サービスを構築 そして、シームレスにC ++、Javaの間、 PythonやPHP、Rubyの、アーラン、Perlの、 ハスケル、C#、ココア、Smalltalkの、および OCamlでます。
自分のホームページに始めるための素晴らしい例があります。
一つの簡単な質問:なぜバイナリ?ペイロード自体はバイナリである、またはあなただけのバイナリ形式を好むのですか? かつての場合、それはあまりにもJSONまたはXMLでBase64エンコードを使用することが可能です。それは多くのユースケースでは問題は必ずしも十分なより多くのスペース(〜34%)、そして少しより多くの処理オーバーヘッドではなくを使用しています。