4

Objective-C で分散オブジェクトを使用するサーバー/クライアント アプリが動作しています。私が今苦労しているのは、アプリをマルチスレッドにすることです。より多くのユーザーが同時にサーバーにアクセスできるようにします。

これがサーバーの主な機能です。ここで、nsconnection オブジェクトを作成します。

私の理解では、これにアプローチする方法は、ユーザーがサーバーにアクセスしようとしたときに、その特定の呼び出しに新しいスレッドを割り当てる必要があるということです。[conn runInNewThread] がこれを処理する必要がありますか?

どんな考えでも大歓迎です...

サーバーのコードは次のとおりです。

int main (void)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

Transactions *trans = [Transactions new];
NSConnection *conn  = [NSConnection defaultConnection];        
[conn setRootObject: trans];
[conn runInNewThread];

if (![conn registerName:@"holycow"]) 
{
    NSLog (@"Failed registering holycow.");
    exit (1);
}

NSLog (@"waiting for connections...");
[[NSRunLoop currentRunLoop] run];

[pool release];
return 0;
}
4

2 に答える 2

0

私がテストを実行したとき、@Parag Bafnaは彼の答えに正しかった。ただし、これを支援する可能性があるサーバーで特別な種類のアーキテクチャを使用しました。たとえば、サーバー デーモンでの実行に時間がかかるコマンドを考えてみましょう。これにより、サーバーが少しハングアップし、接続の処理が大幅に遅くなる可能性があります。これが私の解決策です。

  1. プロパティを使用して、クライアントに非同期クラス メソッドを呼び出させonewayます。これを としましょうrunProcess

  2. タスクを実行runProcesspopen()、PID をグローバル変数として保持します。

  3. 次に、バックグラウンドでperformSelectorInBackground呼び出される同期クラス メソッドを実行するために使用しますreadProcess

  4. では、以前に確立された出力を読み取り (グローバル変数 に注意してください)、最後に読み取った行を最近読み取った行のグローバル変数に追加するためreadProcessに使用します。このメソッドはバックグラウンド タスクとして実行され、クライアントはすでに から切断されています。while(fgets(buff, sizeof(buff), ghPID)!=NULL)popen()ghPIDrunProcess

  5. ここで、クライアントを という同期クラス メソッドに接続しますgetProcessData。これは、最近読み取られた行のグローバル変数を取得し、それを返す必要があります。それほど時間はかからないため、クライアントはそのクラス メソッドからすぐに切断されます。

  6. その後、クライアントは、完了したことがわかるまでそのデータをポーリングできます。isProcessRunningこれを支援するために、呼び出されたサーバー デーモンのグローバル ブール変数をチェックしてgbRunningtrue/false を返す同期メソッドを作成できます。もちろん、サーバーがpopen()タスクの実行でビジー状態のときに、さまざまなクラス メソッドでサーバー デーモンの変数を true/false に切り替えるのはユーザー次第です。

このようにすることで、サーバー デーモンは同時リクエストにはるかに高速に応答できます。

追加のヒントは、kill ファイルまたはその他のメカニズム (共有メモリ? SIGHUP?) を使用することです。これにより、while ループの中でそのプロセスを停止したい場合は、/tmp のどこかに kill ファイルをドロップするだけで済みます。インスタンスとプロセスはpcloseそれを強制終了してから、強制終了ファイルを消去します。また、サーバー デーモンから特定のプロセスを一度に 1 つだけ実行するようにしたい場合は、プロセスを開始する前にこれを行います。

于 2016-04-02T06:30:39.057 に答える
0

クライアント メッセージに応答するには、応答するサーバー オブジェクトを NSConnection クラスのインスタンスの「ルート オブジェクト」として設定し、この NSConnection を名前でネットワークに登録する必要があります。

したがって、分散オブジェクトの場合、単一のサーバー オブジェクトで複数のクライアントを処理できます。または、より多くのサーバー オブジェクトを作成して、クライアントを分割することもできます。

于 2012-02-25T20:05:22.543 に答える