簡體   English   中英

iOS:outputStream不會保持打開狀態

[英]iOS: outputStream does not stay open

好的,所以我正在實現NSOutput和Input Streams。 初始化后,流打開並連接到我在PC上運行的TCPServer,但是一旦在初始化功能之外出現,則流似乎關閉了,或者流沒有正確存儲。 我不太確定,因此非常感謝您的協助

在我的.h文件中:

@interface AVCamViewController : UIViewController <UIImagePickerControllerDelegate,UINavigationControllerDelegate, NSStreamDelegate> {
    NSOutputStream *outputStream;
    NSInputStream *inputStream;
}

@property (retain) NSInputStream *inputStream;
@property (retain) NSOutputStream *outputStream;

在我的.m文件中:

@synthesize inputStream, outputStream;

    -(void)sendaResponse
    {
        NSString *response = [NSString stringWithFormat:@"Hello from Ipad Simulator"];
        NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
        [outputStream write:[data bytes] maxLength:[data length]];
        NSLog(@"%u", outputStream.streamStatus);
    }

    -(void)initNetworkCommunication
    {
        CFReadStreamRef readStream;
        CFWriteStreamRef writeStream;
        CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"10.9.100.122", 80, &readStream, &writeStream);

        NSInputStream *inputStream = (NSInputStream *) readStream;
        NSOutputStream *outputStream = (NSOutputStream *) writeStream;

        [inputStream setDelegate:self];
        [outputStream setDelegate:self];
        [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [inputStream open];
        [outputStream open];


        NSLog(@"%u and %u", inputStream.streamStatus, outputStream.streamStatus);
        NSString *response = [NSString stringWithFormat:@"Hello from Mikes Ipad Simulator"];
        NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
        [outputStream write:[data bytes] maxLength:[data length]];
        NSLog(@"%u", outputStream.streamStatus);
    }

    -(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
    {
        switch (eventCode) {
            case NSStreamEventOpenCompleted:
                NSLog(@"Stream Opened %u", outputStream.streamStatus);
                break;

            case NSStreamEventHasBytesAvailable:
                if(aStream == inputStream)
                {
                    uint8_t buffer [1024];
                    int len;

                    while ([inputStream hasBytesAvailable])
                    {
                        len = [inputStream read:buffer maxLength:sizeof(buffer)];
                        if(len>0)
                        {
                            NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];

                            if(nil != output)
                            {
                                NSLog(@"Server said: %@", output);
                            }
                        }
                    }
                }
                break;

            case NSStreamEventErrorOccurred:
                NSLog(@"Can not connect to the host!");
                break;

            case NSStreamEventEndEncountered:
                if(aStream == inputStream)
                    NSLog(@"Ending input stream");
                if(aStream == outputStream)
                    NSLog(@"Ending output stream");

                [aStream close];
                [aStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
                [aStream release];
                aStream = nil;
                break;

            default:
                break;
        }
    }

在initNetworkConnection中,模擬器連接到我的TCPServer並打開一個連接(streamstatus = 2)。 收到消息“來自Ipad Simulator的Hello”。 但是然后我從按鈕單擊中調用了“ sendaResponse”方法,然后streamstatus = 0,“ outputstream”似乎沒有初始化。 我只是不能正確保留變量嗎?

我假設您正在使用ARC。 刪除此代碼:

{
NSOutputStream *outputStream;
NSInputStream *inputStream;
}

@synthesize inputStream, outputStream;

只是在屬性和實例變量之間使您感到困惑。 結果是,您直接設置實例變量,而流實例被ARC釋放。

相反,刪除上面的代碼后,請使用self.inputStreamself.outputStream訪問流。 這將使屬性正常工作,並確保遵守您配置的“保留”規范。

您的原始代碼也可能只是不嘗試設置屬性...您的配置應為:

    NSInputStream *inputStream = (NSInputStream *) readStream;
    NSOutputStream *outputStream = (NSOutputStream *) writeStream;

    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];

self.inputStream = inputStream;
self.outputStream = outputStream;

然后將屬性更改為:

@property (strong) NSInputStream *inputStream;
@property (strong) NSOutputStream *outputStream;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM