如何用 NSStreamEventOpenCompleted 回调 NSStreamDelegate?

问题描述 投票:0回答:3

我一直在做一个

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
不会被调用的可能性是什么,我在文档中看到,如果打开失败,它不会调用它,如果是这样,为什么打开流失败。有什么想法吗?

感谢您的帮助。

ios iphone cocoa-touch nsstream
3个回答
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 客户端和服务器的小应用程序作为例子。


0
投票

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


0
投票

首先,您需要将您的对象设置为您要从中接收事件的 NSStream 对象的委托。您可以通过将流对象的委托属性设置为您的对象来执行此操作。 当流打开时,NSStreamDelegate 方法 stream:handleEvent: 将被调用,事件代码为 NSStreamEventOpenCompleted。这表示流已成功打开。 在 stream:handleEvent: 的实现中,您可以检查事件代码是否为 NSStreamEventOpenCompleted。如果是,您可以在打开流后执行任何需要执行的操作。例如,您可以向用户显示一条消息,说明流已打开,并为用户提供一个单击此处按钮以继续您的应用程序中的下一步。

© www.soinside.com 2019 - 2024. All rights reserved.