33

我一直在研究NSStreamDelegate,我已经实现了回调,我已经初始化了输入和输出流,就像这样......

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStringRef host = CFSTR("74.125.224.72");
    UInt32 port = 2270;

    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &inputStream, &writeStream);

    if (writeStream && inputStream) {

        inputStream = (__bridge  NSInputStream *)readStream;
        [inputStream setDelegate:self];
        [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [inputStream open];

        outputStream = (__bridge  NSOutputStream *)writeStream;
        [outputStream setDelegate:self];
        [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [outputStream open];
     }

即使在打开两个流之后,callback(stream:(NSStream *)theStream handleEvent:)也不会NSStreamEventOpenCompleted为两个流调用流。谁能帮助我我在这里做错了什么。或者什么是NSStreamEventOpenCompleted不会被调用的可能性,我在文档中看到,如果打开失败它不会调用这个,如果是这样,为什么打开流失败。任何想法?

谢谢你的帮助。

4

2 回答 2

0

我使用非常相似的代码,它对我来说很好。试试下面的代码。

   NSString* host = @"192.168.2.105";
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    UInt32 port = 8008;

    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef)(host), port, &readStream, &writeStream);

    if (writeStream && readStream) {

        self.InputStream = (__bridge  NSInputStream *)readStream;
        [self.InputStream setDelegate:self];
        [self.InputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [self.InputStream open];

        self.OutputStream = (__bridge  NSOutputStream *)writeStream;
        [self.OutputStream setDelegate:self];
        [self.OutputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [self.OutputStream open];
    }

如果它不适合您,我可以给您发送一个实现 TCP 客户端和服务器的小应用程序,例如。

于 2015-05-26T20:04:15.567 回答
0

如果是在新的 NSThread 中运行,请确保线程的运行循环在流设置后启动,如 CFRunLoopRun();

于 2021-08-17T02:38:14.503 回答