简体   繁体   English

NSInputStream不间断的连接?

[英]NSInputStream non-stop connection?

So I have both an input stream and an output stream and they are setup as the code provided below. 所以我既有输入流又有输出流,它们被设置为下面提供的代码。 The input stream's delegate method NSStreamEventHasBytesAvailable is called only when i write somedata onto the output stream. 仅当我将一些数据写入输出流时,才调用输入流的委托方法NSStreamEventHasBytesAvailable Why is that? 这是为什么?

// connect to the server and bind the input/output streams
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, _serverAddr, _serverPort,
                                   &readStream, &writeStream);

_inputStream = (__bridge_transfer NSInputStream *)readStream;
_outputStream = (__bridge_transfer NSOutputStream *)writeStream;

// attach the streams to the current processor run loop
[_inputStream setDelegate:self];    

dispatch_async(_inputStreamQueue, ^{
    [_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                            forMode:NSRunLoopCommonModes];

    [_inputStream open];
    [[NSRunLoop currentRunLoop] run];
});


dispatch_async(_outputStreamQueue, ^{
    [_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                             forMode:NSRunLoopCommonModes];
    [_outputStream open];
    [[NSRunLoop currentRunLoop] run];
});

InputStreamDelegate InputStreamDelegate

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
{
dispatch_async(dispatch_get_main_queue(), ^(void) {
    if (stream == _inputStream) {
        [self inputStreamHandleEvent:eventCode];
    }
});

}

 - (void)inputStreamHandleEvent:(NSStreamEvent)eventCode
{
    switch (eventCode) {
    case NSStreamEventHasSpaceAvailable:
    {
        break;
    }
    case NSStreamEventEndEncountered:
    {
        break;
    }

    case NSStreamEventNone:
    {
        break;
    }

    case NSStreamEventErrorOccurred:
    {
        NSLog(@"NSStreamEventErrorOccurred");
        NSError* error = [_inputStream streamError];
        NSString* errorMessage = [NSString stringWithFormat:@"%@ (Code = %ld)",
                                  [error localizedDescription],
                                  (long)[error code]];
        UIAlertView *wifiLostAlert = [[UIAlertView alloc]
                                      initWithTitle:@"Input Stream Error"
                                      message:errorMessage
                                      delegate:nil
                                      cancelButtonTitle:@"Continue"
                                      otherButtonTitles:nil];
        [wifiLostAlert show];

        break;
    }

    case NSStreamEventHasBytesAvailable:
    {
        uint8_t buf[1024];
        int read = 0;

        while ([_inputStream hasBytesAvailable])
        {
            read = [(NSInputStream *)_inputStream read : buf maxLength : 1024];
            if (read > 0)
            {
                NSLog(@"%d bytes read from the input stream.", read);
                [_recvBuf appendBytes:(const void *)buf length:read];
                int processedBytes = 0;
                do
                    {
                        processedBytes = [self processPacket];
                    }
                while (processedBytes > 0);
            }

            else
            {
                NSLog(@"End of the stream reached, or a socket error. Disconnecting.");
                [self disconnect];
            }
        }
        break;
    }

    case NSStreamEventOpenCompleted:
    {
        break;
    }
}

} }

My problem: 我的问题:

So, for the inputStream, I read the received data through the callbacks. 因此,对于inputStream,我通过回调读取了接收到的数据。 This does not happen all the time. 这并非一直发生。 When ever the server responds back, it's not reading the result. 每当服务器响应时,它都不会读取结果。 The input stream seems to work ONLY when I send some data through the output stream, and then it reads the input stream values for the previous communication. 输入流似乎仅在我通过输出流发送一些数据时才起作用,然后它读取先前通信的输入流值。

In terms of logical sequence... 就逻辑顺序而言...

What I expect is this. 我期望的是这个。

1 --> 1' 1-> 1'

2 --> 2' 2-> 2'

3 --> 3' 3-> 3'

This is reality 这是现实

1 --> 1->

2 --> 1' 2-> 1'

3 --> 2' 3-> 2'

Turns out it was a server-side issue. 原来这是服务器端的问题。 Code is good. 代码是好的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM