1

我正在编写一个 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”。但是,该应用程序根本什么都不做。套接字已创建,我可以远程登录到端口 1234,但该应用程序不会向控制台打印任何内容。

我究竟做错了什么?

4

2 回答 2

1

从文档中:

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

那不是你在这里做的。

你要NSFileHandle围绕来自BSD 套接字 API 的套接字文件描述符,或一个CFSocket。这将让您将套接字放在运行循环上。

于 2010-02-16T16:04:27.323 回答
0

You want to use NSSocketPort in the way you're doing, but then create a NSFileHandle to accept connections on the socket. You can get callbacks on the main thread just like you're expecting, first for new connections, and then for data on those connections. Use this O'Reilly article and just ignore the HTTP stuff.

于 2012-05-26T19:46:33.260 回答