1

私はココアアプリを書いています。アプリケーションにはソケットがあり、ソケットが読み取り可能になるたびに、ソケットからデータを読み取り、データを処理し、それに応じてユーザー インターフェイスを更新したいと考えています。読み取りイベント チェックをメイン ループに統合したい。つまり、ソケットをメイン ループに接続し、ソケットが読み取り可能になるたびにメイン ループがコールバックを呼び出すようにしたい。

テスト アプリケーションを作成しましたが、何らかの理由で動作しません。

#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 に telnet できますが、アプリはコンソールに何も出力しません。

私は何を間違っていますか?

4

2 に答える 2

1

ドキュメントから:

NSSocketPort オブジェクトは、分散オブジェクト接続のエンドポイントとして使用できます。

それはあなたがここでやっていることではありません。

あなたがしたいBSD ソケット API からのソケット ファイル記述子の周りのNSFileHandle 、またはCFSocket。_ これにより、ソケットを実行ループに配置できます。

于 2010-02-16T16:04:27.323 に答える
0

NSSocketPort自分のやり方で使用したいがNSFileHandle、ソケットで接続を受け入れるためにを作成します。期待どおりにメインスレッドでコールバックを取得できます。最初は新しい接続に対して、次にそれらの接続に関するデータに対してです。このO'Reillyの記事を使用して、HTTP関連のものを無視してください。

于 2012-05-26T19:46:33.260 に答える