我正在写一个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,但应用程序不会向控制台打印任何内容。
我做错了什么?
答案 0 :(得分:1)
来自文档:
NSSocketPort对象可以用作分布式对象连接的端点。
这不是你在这里做的。
您希望在{BSD套接字API的套接字文件描述符周围NSFileHandle,或 a CFSocket。这将允许您将套接字置于运行循环中。
答案 1 :(得分:0)
您希望以您的方式使用NSSocketPort
,但随后创建NSFileHandle
以接受套接字上的连接。您可以在主线程上获得回调,就像您期望的那样,首先是新连接,然后是这些连接上的数据。使用此O'Reilly article并忽略HTTP内容。