Error appear when i received data from server (data just string).
for example
server sent data (15000bytes)
my iPhone received data (7878bytes)
so I try to searching and i know while method is answer.
but I can't apply my code..
I guess NSMutableData is hint..
how to do ..
Here my code.
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
NSLog(@"stream event %lu", (unsigned long)streamEvent);
switch (streamEvent) {
case NSStreamEventOpenCompleted:
NSLog(@"Stream opened");
if(_connectServer)
{
[_connectServer invalidate];
_connectServer = nil;
}
break;
case NSStreamEventHasBytesAvailable:
if (theStream == inputStream)
{
if(!_serverOpen)
{
uint8_t buffer[1024];
int len;
while ([inputStream hasBytesAvailable])
{
len = (int)[inputStream read:buffer maxLength:sizeof(buffer)];
if (len > 0)
{
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
if (nil != output)
{
[self receivedServerData:output];
if(!_serverOpen)
{
[self initNetworkCommunicationWithIpPort:output];
}
}
}
}
}
else
{
uint8_t buffer[20];
int len;
while ([inputStream hasBytesAvailable])
{
len = (int)[inputStream read:buffer maxLength:sizeof(buffer)];
NSString* strBuffer = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
NSLog(@"STRBUFFER %@", strBuffer);
strBuffer = [strBuffer substringFromIndex:7];
uint8_t dataBuffer[[strBuffer intValue]];
NSLog(@"databuffer %lu", sizeof(dataBuffer));
int lenBuffer = [inputStream read:dataBuffer maxLength:sizeof(dataBuffer)];
NSLog(@"lenBuffer %d", lenBuffer);
int position = 0 ;
if (lenBuffer > 0)
{
NSString *output = [[NSString alloc] initWithBytes:dataBuffer length:lenBuffer encoding:NSUTF8StringEncoding];
if (nil != output)
{
[self receivedServerData:output];
if(!_serverOpen)
{
[self initNetworkCommunicationWithIpPort:output];
}
}
}
}
}
}
else
{
NSLog(@"333");
}
break;
case NSStreamEventHasSpaceAvailable:
{
}
break;
case NSStreamEventErrorOccurred:
NSLog(@"Can not connect to the host!");
_serverOpen = NO;
break;
case NSStreamEventEndEncountered:
[theStream close];
[theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
theStream = nil;
break;
default:
NSLog(@"Unknown event");
}
}
As @Manav states you can expect to receive the stream in several chunks, just append each to the NSMutableData until you get an NSStreamEventEndEncountered
.