OS X:如何使用NSRunLoop观看套接字读取事件?

时间:2010-02-16 15:33:19

标签: objective-c cocoa nsrunloop foundationkit nssocketport

我正在写一个Cocoa应用程序。应用程序中有一个套接字,每当套接字变得可读时,我想从套接字读取数据,处理数据,并相应地更新用户界面。我想在主循环中集成读取事件检查,即我想将套接字附加到主循环,并且只要该套接字变得可读,主循环就会调用回调。

我已经编写了一个测试应用程序,但由于某些原因它不起作用:

#include <stdio.h>
#include <Foundation/NSAutoReleasePool.h>
#include <Foundation/NSRunLoop.h>
#include <Foundation/NSPort.h>

@interface MyDelegate : NSObject <NSPortDelegate> {
}
- (void)handlePortMessage:(NSPortMessage *)portMessage;
@end

@implementation MyDelegate
- (void)handlePortMessage:(NSPortMessage *)portMessage {
    printf("Haiz\n");
}
@end

int
main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSSocketPort *server = [NSSocketPort alloc];
    MyDelegate *foo = [MyDelegate alloc];
    [server initWithTCPPort: 1234];
    [server setDelegate: foo];
    [[NSRunLoop mainRunLoop] addPort: server forMode: NSDefaultRunLoopMode];
    [[NSRunLoop mainRunLoop] run];
    [pool release];
    return 0;
}

应用程序应该在localhost端口1234上侦听,每当有人连接到服务器或将数据发送到服务器时,应用程序应该在控制台上打印“Haiz”。然而该应用程序什么都不做。套接字已创建,我可以telnet到端口1234,但应用程序不会向控制台打印任何内容。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

来自文档:

  

NSSocketPort对象可以用作分布式对象连接的端点。

这不是你在这里做的。

您希望在{BSD套接字API的套接字文件描述符周围NSFileHandle,或 a CFSocket。这将允许您将套接字置于运行循环中。

答案 1 :(得分:0)

您希望以您的方式使用NSSocketPort,但随后创建NSFileHandle以接受套接字上的连接。您可以在主线程上获得回调,就像您期望的那样,首先是新连接,然后是这些连接上的数据。使用此O'Reilly article并忽略HTTP内容。