質問

バックエンドデーモンプロセス(実際にはほとんどヘッドレスのCocoaアプリ、おそらく)を使用し、ローカルで実行される0個以上の「クライアント」アプリケーションとともに、Mac上でCocoaアプリケーションを構築することを検討しています(ただし、可能であれば、リモートクライアントもサポートしたいと考えています。リモート クライアントは他の Mac または iPhone OS デバイスのみになります)。

通信されるデータは非常に些細なもので、ほとんどがテキストとコマンド (いずれにしてもテキストとして表現できると思います) だけで、場合によっては小さなファイル (おそらく画像) も含まれます。

これを行うための方法をいくつか検討しましたが、当面のタスクにどれが「最適」であるかわかりません。私が検討したこと:

  • ファイルの読み取りと書き込み (…はい)、非常に基本的ですが、あまり拡張性がありません。
  • 純粋なソケット (ソケットの経験はありませんが、ローカルおよびネットワーク経由でデータを送信するためにソケットを使用できると思います。全部Cocoaでやるのは面倒そうだけど
  • 分散オブジェクト:このようなタスクにはかなり洗練されていないように思えます
  • NSConnection:このクラスが何をするのか実際には理解できませんが、IPC の検索結果でそれを読んだことがあります。

足りないものがあるとは思いますが、このトピックに関するリソースが不足していることに驚きました。

役に立ちましたか?

解決

現在、同じ質問を検討中です。私にとって、後で Windows クライアントを追加する可能性があるため、状況はさらに複雑になります。あなたの場合、答えはもっと簡単のようです。

検討したオプションについて:

  1. 制御ファイル: 制御ファイルを介して通信することは可能ですが、ファイルは関連するマシン間でネットワーク ファイル システムを介して通信する必要があることに留意する必要があります。したがって、ネットワーク ファイル システムは、実際のネットワーク インフラストラクチャの抽象化として機能しますが、ネットワークが通常持つ完全な能力と柔軟性を提供するわけではありません。 実装: 実際には、クライアント/サーバーのペアごとに少なくとも 2 つのファイルが必要になります。サーバーがクライアントにリクエストを送信するために使用するファイルと、レスポンス用のファイル。各プロセスが双方向通信できる場合は、これを複製する必要があります。さらに、クライアントとサーバーはどちらも「プル」ベースで動作します。つまり、制御ファイルを頻繁に再参照して、何か新しいものが配信されたかどうかを確認する必要があります。

    このソリューションの利点は、新しいテクニックを学ぶ必要性が最小限に抑えられることです。大きな欠点は、プログラム ロジックに大きな要求があることです。多くのことをあなたが処理する必要があります (ファイルは 1 つのまとまりとして書き込まれるのでしょうか、それとも、誰かが一貫性のないファイルを取得する可能性はありますか?)チェックはどれくらいの頻度で実施する必要がありますか?キャッシュなどのファイル システムについて心配する必要はありますか?プログラム コード以外のものをいじらずに、後で暗号化を追加できますか?...)

    移植性が問題である場合 (質問から理解する限り、そうではありません)、このソリューションは別のシステムや別のプログラミング言語にも簡単に移植できるでしょう。ただし、iPhone OS 用のネットワーク ファイル システムについては知りませんが、これについては詳しくありません。

  2. ソケット: プログラミングインターフェイスは確かに異なります。ソケットプログラミングの経験によっては、最初にそれを学習し、後でデバッグする方がより多くの作業が必要になる可能性があります。 実装:実際には、以前と同様のロジック、つまりクライアントとサーバーがネットワーク経由で通信する必要があります。このアプローチの決定的な利点は、プロセスが「プッシュ」ベースで動作できることです。つまり、メッセージが到着するまでソケットをリッスンできるため、制御ファイルを定期的にチェックするよりも優れています。ネットワークの破損や不整合も心配する必要はありません。さらに、プログラムの制御外のものに依存するのではなく、接続の確立方法をより詳細に制御できる (場合もあります) (これも、後で暗号化を追加する場合に重要です)。

    利点は、1 での実装では面倒な多くのことが肩から降ろされることです。欠点は、正しい情報 (ファイル タイプなど) を確実に送受信するために、プログラム ロジックを大幅に変更する必要があることです。

    私の経験では、POSIX とリモート互換性のあるものであれば何でも動作するため、移植性 (つまり、異なるシステムやプログラミング言語への移行の容易さ) は非常に優れています。

    [編集: 特に、2 進数を通信するとすぐにエンディアン性が問題になり、この問題を手動で処理する必要があります。これは、上で述べた「正しい情報」の問題のよくある (!) 特殊なケースです。それはあなたに噛みつきます。PowerPC が Intel Mac と通信しているとき。この特殊なケースは、解決策 3.+4 で解消されます。他のすべての「正しい情報」の問題も一緒になります。]

  3. +4. 分散オブジェクト:NSProxy クラスクラスターは分散オブジェクトを実装するために使用されます。 NSConnection は、情報を送信するための前提条件としてリモート接続を設定する役割を担っているため、このシステムの使用方法を理解すれば、分散オブジェクトも理解できることになります。;^)

    この考え方は、高レベルのプログラム ロジックを変更する必要がないということです (つまり、オブジェクトはメッセージを介して通信し、結果を受け取ります。メッセージと戻り値の型は、ローカル実装で慣れ​​ているものと同じです)。ネットワークインフラストラクチャの詳細を気にする必要はありません。まあ、少なくとも理論上は。 実装: 私も現在取り組んでいる最中なので、理解がまだ限られています。私の理解する限り、特定の構造をセットアップする必要があります。つまり、どのプロセス (ローカルおよび/またはリモート) がどのメッセージを受信できるかを決定する必要があります。これは何 NSConnection そうです。この時点で、クライアント/サーバー アーキテクチャを暗黙的に定義しますが、2 で述べた問題について心配する必要はありません。

    Gnustep プロジェクト サーバーには、2 つの明示的な例を含む導入部があります。これはテクノロジーがどのように機能するかを示しており、実験の良い出発点となります。http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_7.html

    残念ながら、欠点は、他のシステムとの互換性が完全に失われること (ただし、Mac と iPhone/iPad のみについて言及したセットアップでは問題なく実行できます)、および他の言語への移植性が失われることです。Objective-C を使用した Gnustep は、せいぜいコード互換性がありますが、通信する方法はありません。 Gnustep と Cocoa、ここで質問番号 2 に対する私の編集を参照してください。 Mac OS X 上の CORBA (ココア)

    [編集: またまた知らなかった情報を発見しました。それを確認しているうちに NSProxy は iPhone で利用できますが、分散オブジェクト メカニズムの他の部分が利用できるかどうかは確認していません。このリンクによると: http://www.cocoabuilder.com/archive/cocoa/224358-big-picture-relationships-between-nsconnection-nsinputstream-nsoutputstream-etc.html (ページ内で「iPhone OS」というフレーズを検索してください)それらは違います。現時点で iPhone/iPad を使用する必要がある場合、このソリューションは除外されます。]

結論として、一方では新しいテクノロジーを学習 (および実装とデバッグ) する努力と、他方では下位レベルの通信ロジックを手作業でコーディングするという努力との間にはトレードオフがあります。分散オブジェクトのアプローチは最も負担がかかり、プログラム ロジックの変更は最小限で済みますが、習得が最も難しく、また (残念ながら) 移植性も最も低くなります。

他のヒント

免責事項: 分散オブジェクトは、 iPhoneでは利用できません.


なぜ見つけるのですか 分散オブジェクト エレガントではない?ここではそれらはうまく一致しているように思えます:

  • 基本型と Objective-C クラスの透過的マーシャリング
  • クライアントがローカルかリモートかはあまり関係ありません
  • Cocoa ベースのアプリケーションでは追加作業はそれほど多くありません

ドキュメントを読むと、実際よりも手間がかかるように聞こえるかもしれませんが、基本的に行う必要があるのは、プロトコルを適切に使用し、サーバーのルート オブジェクトをエクスポートするか、サーバー ルート オブジェクトに接続することだけです。
残りの部分は、指定されたシナリオで舞台裏で自動的に行われます。

私たちが使用しているのは トーモネットワーキング 問題なく動作し、セットアップも迅速です。基本的に、ローカル ネットワークで NSCoding 準拠のオブジェクトを送信できますが、もちろん、クライアントとサーバーが同じマシン上にある場合にも機能します。基礎クラスのラッパーとして、ペアリングや再接続などを処理します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top