在Cocoa中构建服务器/客户端应用程序

时间:2011-08-12 23:08:25

标签: objective-c cocoa

我构建了一个相当简单的程序,它可以监视文件夹,在添加文件时对其进行操作,并提供简单的进度视图。通过NSOperation的子类监视该文件夹,该子类通过NSNotificationCenter将NSDictionary中的信息传递到我的进度视图。

现在我需要解决问题并在我的服务器上运行监视文件夹/处理部分,并构建一个客户端来监视来自多个工作站的进度。我的问题是我不知道如何实现这一点,我的搜索并没有真正帮助我。

我似乎得到了许多过时的解决方案(WebObjects,Portable Distributed Objects)或不完整的信息。看起来我想要使用NSStream来回传递数据,但我在NSStream上找到的所有内容看起来都是为客户端设置的,因为它正在寻找一个IP地址。设置服务器和连接客户端的最佳方法是什么?

3 个答案:

答案 0 :(得分:7)

我建议使用TCP来做这样的事情。由于(我假设)您正在为BSD编写此软件(Mac OS X和iPhone都是BSD),您可以使用BSD C套接字或Objective-C包装器。一个好的客户端库是CocoaAsyncSocket。我个人为TCP网络编写了一个名为SocketKit的轻量级Objective-C套接字类。该库的用法如下:

// open a connection
SKTCPSocket * socket = [[SKTCPSocket alloc] initWithRemoteHost:@"SERVER_IP" port:SERVER_PORT];
// write data
[socket writeData:someData];
// read data
NSData * someData = [socket readData:4];
// close the socket
[socket close];
[socket release];

从服务器的角度来看,您可以使用SKTCPSocketServer类侦听端口:

SKTCPSocket * aSocket = nil;
SKTCPSocketServer * server = [[SKTCPSocketServer alloc] initListeningOnPort:1337];
@try {
    [server listen];
    while ((aSocket = (SKTCPSocket *)[server acceptConnection]) != nil) {
        // do something with aSocket
        [aSocket close];
    }
} @catch (NSException * e) {
    NSLog(@"Exception : %@", e);
}
[server stopServer];
[server release];

当然使用TCP套接字意味着编写自己的网络协议。一个简单的例子是发送一个四字节长度的字段,然后是NSDictionary的数据或那种性质的东西。这可以让您完成类似于非常基本的分布式对象系统的事情。

答案 1 :(得分:4)

为什么不看一下Bonjour的零配置网络(即你不必找到服务器的IP地址)?

由于Windows和iOS(iPhone / iPad)上也支持Bonjour,您甚至可以使您的应用程序成为多平台(例如Windows和Mac客户端上的服务器,反之亦然),甚至可以让iPhone充当您服务器的客户端(不知道你的情况是否合理,但我只是建议)。

答案 2 :(得分:0)

不幸的是,这是一个可可相当弱的地方。忘记WebObjects(Apple有)。您可能应该忘记分布式对象。 Mac上没有真正的内置客户端/服务器解决方案。 iOS有一些不错的点对点东西,但它对于客户端/服务器来说仍然没用。

我的建议是使用简单的REST API。使用cocoahttpserver构建您的服务器。使用NSURLConnectionASIHTTPRequest建立您的客户。把事情简单化。我喜欢JSON的协议。 YAJL对我来说效果很好,但对于一些非常简单的事情,有很多选择。