iosobjective-cnsstream

NSinputstream read data is returning null value?


In my app I'm using NSStreams for client server communication. In the delegate method in event hasbytesAvailable when I'm reading the data its returning null

Case: when the length is 4096 then read is fails and returns nil; Means when the length is equal to buffer size its failing to read, even if I put the maxlength to 4000 and buffer size to 4096, then also whenever 4000 bytes are read its failing. what to do?

Here is the code:

case NSStreamEventHasBytesAvailable:

     if (aStream == inputStream) {
             uint8_t buffer[4096];
             int len;
             while ([inputStream hasBytesAvailable]) {                      
                 len = (int)[inputStream read:buffer maxLength:sizeof(buffer)];
                 NSLog(@"\nThe length is -- %d\n",len);
                     if (len > 0) {
                            NSData *data = [[NSData alloc] initWithBytes:buffer length:len];
                            output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                              // output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];                            
                              }
                  }
               }         

         NSLog(@"\n\n%@\n\n",output);

Solution

  • I think the code is absolutely fine and it should read the data, may be after you've read 4096 bytes there might be some more bytes available and loop continues, and you are initialising the output variable again, So you might be missing it.

    Use the following snippet:

    if (aStream == inputStream) {
                      uint8_t buffer[4096];
                      int len;
                      NSString* tempOutput = @"";
    
                      while ([inputStream hasBytesAvailable]) {
    
                            len = (int)[inputStream read:buffer maxLength:sizeof(buffer)];
                            NSLog(@"\nThe length is -- %d\n",len);
                            if (len > 0) {
                                NSData *data = [[NSData alloc] initWithBytes:buffer length:len];
                                output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                tempOutput = [tempOutput stringByAppendingString:output];
                                  // output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
    
                                  }
                      }
                    output = tempOutput;
                   }