2009-06-01 14 views
11

質問:同じアプリケーションを実行している別のコンピュータにインターネット経由でパケットを接続して送信できるPythonアプリケーションを作成するにはどうすればよいですか?私が使用できる既存のコード/ライブラリはありますか?Pythonで2台のコンピュータ間の接続を作成する

背景:私はプログラミングにかなり新しい(HS上級者)。私はPythonで多くの簡単なことを作成しましたが、私は最近、より大きなプロジェクトを開始することに決めました。マジック:ギャザリングブースタードラフトシミュレータの作成を検討していますが、スキルセットがあれば実現可能かどうかはわかりませんので、開始する前に尋ねています。アプリケーションは、カードが選択/通過されているコンピュータ間でデータを送信する必要があります。

ありがとうございます!

答えて

12

Twistedは、MITでライセンスされたpythonイベント駆動型ネットワークエンジンです。単一のマシンが1つ以上の他のマシンと通信できることを意味し、データの送受信間の他の処理をすべて非同期に実行し、単一のスレッド/プロセスで実行することを意味します。

これは、すぐに使用できる多くのプロトコルをサポートしているので、既存のものを使用することもできます。これは、サードパーティ製のソフトウェアからプロトコルをサポートしているためです(HTTPを使用するミドルウェアソフトウェアはプロキシなど互換性があります)。

独自の通信プロトコルを簡単に作成することもできますあなたが欲しいもの。

documentationは例で埋められています。

3

見栄えの良い場所は、Python Standard Libraryです。特に関連性があるだろういくつかのセクションがあります:あなたはこの経験がないことを述べているので

は、私が始まることをお勧めしたいですHTTPベースの実装。 HTTPプロトコルは、操作が非常に簡単で簡単です。さらに、サーバーの場合はwebpy、クライアントの場合は標準ライブラリのHTTPLibなど、この操作をサポートする素晴らしいフレームワークがあります。

実際にネットワークに乗りたい場合は、socketベースの実装は教育的かもしれません。これは、のネットワークコードので使用されている基本的な概念を教えてくれる一方で、ファイルストリームに似たインターフェイスになります。

+0

ソケット用の便利なハウツーがあります:http://docs.python.org/howto/sockets.html。 –

+0

初心者には低レベルのソケットを推奨します。私の教授経験では、高度な枠組みを教えて、下線付きの実装が間違ったやり方を教えるよりもはるかに理にかなっていることを示します。 – nosklo

+1

私はそれが学生がそれから出ようとしているものと実際にどのレベルにあるのかによると思います。私のポーから、もし私がネットワーク通信について学びたいと思っていて、何とかソケットについて学んでいなかったら、私は気になるでしょう。最初の接続が形成された後、ソケットを使用することは、ファイルを読み書きすることよりもわずかに困難です。メリットは、学生がデータをどのように表現したいかを考えることです。 – Doug

7

標準ライブラリには、SocketServer(文書番号here)が含まれています。

ただし、メッセージキューを使用する方がよい場合があります。 Pythonインタフェースを含む多くの優れた実装が既に存在しています。以前はRabbitMQを使っていました。アイデアは、コンピュータがキューに登録していて、イベントを投稿したり受信したりできるということです。

+1

+1:あなたに役立つライブラリの実装を使用してください – nosklo

1

通信は、いずれかの方法でソケットで行われます。既存の高レベルライブラリを使用するか、独自のライブラリを使用するかどうかの質問です。

これを学習経験としてやっているのなら、可能な限り低レベルから始めて、実際のナットとボルトを見たいと思うかもしれません。つまり、おそらくa SocketServerで始まり、TCP接続を使用したいと考えています(TCPは基本的にデータの配信が保証されていますが、UDPはそうではありません)。

Googleの簡単なコード例です。 1つを設定することは非常に簡単です。しかし、あなたは通信プロトコルのすべての詳細を定義しなければなりません。いつ、何を終わりに聞き終えるのか、聞き手が何を期待するのか、返信を確認するために返信しますか?

+1

-1:TCPソケットのナットとボルトが何かを助けることに強く反対します。ソケットを直接使用すると、あなたのコードを* NOT *する方法を学ぶことができます。代わりに高レベルで学び、あなたが選択したライブラリを研究してください。 – nosklo

+1

私はC言語でのプログラミングはほとんど行っていませんが、私はそれを知って大変うれしく思います。なぜなら、より高水準の言語が実際にメモリや複雑なデータ型を使って何をしているのかを理解することができるからです。私は同じことがソケットプログラミングにも当てはまると思います。実稼働アプリケーションのTCPレベルにはほとんど決して行きませんが、そのレベルでのいくつかの演習では、より高いレベルのフレームワークが何をしているのかをより深く理解することができます。 –

+0

@ジョンピリー:そうです、初心者はC(またはアセンブリ)を最初に*学ぶべきだと思いますか?私はそうは思わない。自然な傾向は、最初に高いレベルを学ぶことであり、一般的なコンセプトが十分に学習された後で、後で低いレベルのコンセプトを理解するために必要なだけ下がることだと思います。私のポイントは、フレームワークが最初に来るべきだということです。 – nosklo

1

また、 out Pyro(Pythonリモーティングオブジェクト)。詳細はSe this answerを参照してください。

Pyroでは、Pythonオブジェクトインスタンスをリモートで呼び出せるサービスとして公開することができます。 Pyroはおそらく、PythonからPythonへのプロセス通信を実装する最も簡単な方法です。

1

このようなことについては、Kamaeliaも見ておく価値があります。これはオリジナルのネットワークシステムであり、比較的直感的です。 リンク:Overview of basic TCP systemSimple Chat serverBuilding a layered protocolwalk-through of how to evolve new components他の極端な:P2P無線システム:source,peer

Googleの夏に3年連続で参加し、初心者がシステムにアクセスできるかどうかをテストしました。経験豊富な開発者と経験の浅い開発者の両方に積極的に取り組んでいます。それらのすべてが有用なシステムを構築することができました。

UNIXパイプラインで遊んだことがあれば、アイデアはよく知られているはずです。

警告:私は理にかなって、いくつかの異なるアプローチで遊んで、あなたががこれらのことを行う方法を学びたいのであれば

:-) Kamaeliaの主要なチャンクを書いた、とあなたは間違いなくツイストをチェックアウトする必要があります(標準この質問への答え)、Pyro &標準ライブラリツール。それぞれに異なるアプローチがあり、それらを学ぶことは間違いなくあなたに利益をもたらすでしょう!

しかし、noskloのように、ソケットライブラリを直接使うのではなく、ライブラリを代わりに使うことをお勧めします。ソケットプログラミングは、人が気付いているよりもはるかに難しいからです。

関連する問題