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

为了响应客户端消息,响应服务器对象必须设置为 NSConnection 类实例的“根对象”,并且此 NSConnection 必须按名称向网络注册。

所以在分布式对象的情况下,单个服务器对象可以处理多个客户端。或者您可以创建更多服务器对象并划分您的客户端。

于 2012-02-25T20:05:22.543 回答
0

当我进行测试时,@Parag Bafna 的回答是正确的。但是,我在服务器中使用了一种特殊的体系结构,它可能对此有所帮助。以在服务器守护程序上运行需要很长时间的命令为例。这可能会使服务器挂起一点,并使处理连接的速度变慢。这是我的解决方案。

  1. oneway让客户端使用该属性调用异步类方法。让我们称之为runProcess.

  2. runProcesspopen()任务进行操作并将 PID 保留为全局变量。

  3. 然后,让它用于运行在后台performSelectorInBackground调用的同步类方法。readProcess

  4. readProcess中,我使用while(fgets(buff, sizeof(buff), ghPID)!=NULL)读取先前建立的popen()输出(注意全局变量,ghPID)并将最新的行读取附加到最近读取的行的全局变量中。此方法作为后台任务运行,并且客户端已经从runProcess.

  5. 现在让客户端连接到一个名为getProcessData. 然后,这应该读取最近行的全局变量并将其返回。由于这不会花费很长时间,因此客户端会很快与该类方法断开连接。

  6. 然后,客户端可以轮询该数据,直到它知道它已完成。为此,您可以创建一个名为的同步方法isProcessRunning,该方法可以检查被调用的服务器守护程序上的全局布尔变量gbRunning并返回真/假。当然,当服务器忙于运行popen()任务时,您可以在各种类方法中翻转服务器守护程序中的该变量 true/false。

通过这种方式,您的服务器守护进程可以更快地响应并发请求。

另一个提示是使用终止文件或其他机制(共享内存?SIGHUP?),这样如果您处于 while 循环中并且您希望该进程停止,您可以将终止文件放在 /tmp 中的某处实例和进程将使用pclose杀死它,然后擦除杀死文件。如果我想确保从该服务器守护程序一次只运行一个特定进程,我也会在启动进程之前执行此操作。

于 2016-04-02T06:30:39.057 回答