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

Kri*_*ris 9 cocoa objective-c

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

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

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

Ale*_*hol 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];
Run Code Online (Sandbox Code Playgroud)

从服务器的角度来看,您可以使用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];
Run Code Online (Sandbox Code Playgroud)

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