Pythonを使用してLANでサービスを公開および見つけるための適切な方法
-
30-09-2019 - |
質問
私のアプリはTCPソケットを開き、同じアプリケーションを使用してネットワーク上の他のユーザーからのデータを待ちます。同時に、ネットワーク上の指定されたホストにデータをブロードキャストできます。
現在、データを送信できるように、宛先ホストのIPを手動で入力する必要があります。アプリケーションを実行しているすべてのホストのリストを見つけて、データをブロードキャストするホストをユーザーに選択できるようにしたいと思います。
Bonjour/Zeroconfはこれを達成するために行くのに適したルートですか? (OSX/win/*nixをクロスプラットフォームしたいです)
解決
ネットワーク上の指定されたホストにデータをブロードキャストできます
これは非sequiturです。
私はあなたが実際に放送を意味していないと推測しています、あなたは意味します ユニキャスト または単に「送信」?
Bonjour/Zeroconfはこれを達成するために行くのに適したルートですか?
これは、ターゲット環境とアプリケーションの意図を実際に依存します。
Ignacioが指摘しているように、Zeroconf/MDNSが現在動作するためにWindowsにAppleソフトウェアをインストールする必要があります。
これは、小さなオフィス /家の使用に適している可能性があります。
ただし、より大きなネットワークには、さまざまな理由でレイヤー2マルチキャストが無効になっている場合があります。その時点で、アプリが困っている可能性があります。
エンタープライズ環境で動作したい場合は、一部の構成が必要ですが、エッジで(アプリクライアントインスタンスで)実行する必要はありません。
DHCPオプションを介して、またはDNSサービスレコードを使用することもできます。これらの場合、アクティブなクライアントを追跡するためのクエリ可能なサーバーを作成する可能性があります。
ネットワークアプリの設計中に考慮すべき2つのこと:
- ネットワーク上でアプリケーションの複数の「インストール」を実行する理由はありますか?
- 常にバージョン化の意味を考えてみましょう。1つのクライアントは別のクライアントよりも最新です、彼らはまだ互いに話し合うか、少なくとも優雅に失敗することができますか?
他のヒント
この場合、Zeroconf/DNS-SDは素晴らしいアイデアです。 OS XとWindowsのBonjourによって提供されます(ただし、別々に、またはWindowsのApple製品の一部としてインストールする必要があります)、Foss *nixでAvahiによって提供されます。
Zeroconfはとても良いスタートだと思います。あなたは見つけるかもしれません このドキュメント 使える。
Webページにリストがあります。インターネット通信が必要な場合は素晴らしいです。
<dl_service updated="2010-12-03 11:55:40+01:00">
<client name="internal" ip="10.0.23.234" external_ip="1.1.1.1"/>
<client name="bigone" ip="2.2.2.2" external_ip="2.2.2.2">
<messsage type="connect" from="Bigone" to="internal" />
</client>
</dl_service>
私の最初のアイデアは、ファイアウォールパンチなどを追加することでしたが、外部IPを使用して問題になるためにあまりにも多くのホストを悩ませることはできませんでした。
しかし、少なくともLinux+MacOSXを使用している場合は、Windowsについてまったく知らないことをZeroconfを本当にお勧めします。