30

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

伝達されるデータはかなり些細なもので、ほとんどはテキストとコマンド(とにかくテキストとして表すことができると思います)、そしてたまに小さなファイル(おそらく画像)です。

これを行うためのいくつかの方法を見てきましたが、目前のタスクに「最適」な方法がわかりません。私が検討したこと:

  • ファイルの読み取りと書き込み(…はい)、非常に基本的ですが、あまりスケーラブルではありません。
  • 純粋なソケット(私はソケットの経験がありませんが、ローカルおよびネットワークを介してデータを送信するためにそれらを使用できると思います。Cocoaですべてを行うと面倒に思えますが
  • 分散オブジェクト:このようなタスクにはかなりエレガントではないようです
  • NSConnection:このクラスが何をするのか本当に理解できませんが、いくつかのIPC検索結果でそれを読みました

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

4

3 に答える 3

16

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

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

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

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

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

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

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

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

    [編集:特に、2進数を伝達するとすぐにエンディアンが問題になり、この問題を手動で処理する必要があります。これは、前述の「正しい情報」の問題の一般的な(!)特殊なケースです。たとえば、PowerPCがIntelMacと通信している場合に噛み付きます。この特殊なケースは、ソリューション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についてのみ言及したセットアップで問題なく動作します)、他の言語への移植性が失われることです。Gnustep with Objective-Cはせいぜいコード互換ですが、 GnustepとCocoaの間で通信する方法はありません。ここで質問番号2の編集を参照してください:Mac OS X上のCORBA(Cocoa)

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

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

于 2010-05-23T19:20:18.320 に答える
14

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


なぜ分散オブジェクトがエレガントでないと思うのですか?彼らはここで良い一致のように聞こえます:

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

ドキュメントは実際よりも多くの作業のように聞こえるかもしれませんが、基本的に行う必要があるのは、プロトコルをクリーンに使用し、サーバーのルートオブジェクトをエクスポートするか、それぞれに接続することです。
残りは、与えられたシナリオの舞台裏で自動的に行われるはずです。

于 2010-05-17T03:11:33.683 に答える
7

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

于 2010-05-26T14:25:41.520 に答える