ОС Х:как смотреть события чтения сокетов с помощью NSRunLoop?
-
20-09-2019 - |
Вопрос
Я пишу приложение 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;
}
Предполагается, что приложение прослушивает порт 1234 локального хоста, и всякий раз, когда кто-то подключается к серверу или отправляет данные на сервер, приложение должно печатать «Haiz» на консоли.Однако приложение вообще ничего не делает.Сокет создан, и я могу подключиться к порту 1234, но приложение ничего не выводит на консоль.
Что я делаю не так?
Решение
Из документации:
Объект NSSocketPort можно использовать в качестве конечной точки для подключений распределенных объектов.
Это не то, что вы здесь делаете.
Вы хотите или Нсфилехандле вокруг дескриптора файла сокета из API сокетов BSD или а CFSocket.Это позволит вам поместить сокет в цикл выполнения.
Другие советы
Вы хотите использовать NSSocketPort
так, как вы это делаете, но затем создайте NSFileHandle
принимать соединения на сокете.Вы можете получать обратные вызовы в основном потоке, как и ожидали, сначала для новых соединений, а затем для данных об этих соединениях.Использовать это Статья О'Рейли и просто игнорируйте HTTP-материалы.