クライアントとサーバーの両方が OS X アプリであり、どちらも Cocoa フレームワークを使用して Objective-C で記述できる限り、Cocoa の分散オブジェクト(DO) テクノロジを検討することを強くお勧めします。ここでは、分散オブジェクトのチュートリアルを提供しようとはしません。なぜそれが役立つのかを説明するだけです...
DO は非同期ネットワークの詳細を処理します (すべてのクライアントの更新は単一のスレッドで発生する可能性があります)。さらに、リモート オブジェクトとの通信のセマンティクス (クライアントからサーバーへ、またはその逆。接続が確立されると DO は双方向) は、インプロセス通信と非常に似ています。つまり、リモート オブジェクト (実際NSDistantObject
には、接続の反対側のオブジェクトへのプロキシとして機能するオブジェクト) への参照を取得すると、クライアント コードは、あたかもローカルであるかのように、リモート オブジェクトにメッセージを送信できます。
[remoteServer update:client];
クライアントから、または
[[remoteClientList objectAtIndex:i] update:server];
サーバーから。分散オブジェクト プログラミング ガイドを読んだ後、接続の設定と remoteServer または remoteClient 参照の取得の詳細を説明します。
DO を使用することの欠点は、Cocoa に縛られていることです。分散オブジェクトを使用して通信する Cocoa 以外のクライアントまたはサーバーを作成するのは非常に困難です。Cocoa 以外のクライアントまたはサーバーの実装が必要になる可能性がある場合は、DO を使用しないでください。この場合、多くのクロスプラットフォームと言語サポートを備えたシンプルなものをお勧めします. HTTP 経由の REST スタイルの API は適切なオプションです。HTTP リクエストとレスポンスの実装方法については、Cocoa URL Loading Systemのドキュメントを参照してください。Cocoa コードに HTTP サーバーを実装する方法については、Apple のCocoaHTTPServerサンプル コードまたは同名の code.google.com プロジェクトを参照してください。
最後のオプションとして、独自のネットワーク プロトコルを実装する場合は、Cocoa Stream Programming Guideを参照してください。NSStream
のサブクラスを使用すると、ネットワーク ソケットをリッスンし、そのソケットとの間で非同期の読み取り/書き込みを処理できます。多くの人がこの目的でAsyncSocketを使用しています。(下位レベルの) CFStream と CFSocket をラップし、ネットワーク コードの記述をいくらか容易にします。