我是套接字編程的新手,我參考了http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server,我使用的是PHP服務器,我面對的問題是,我可以使用發送/接收消息插座,但我收到的消息是像我收到的消息打破應該是「你好abcd」,但它給了我「」然後一段時間後「llo」然後一段時間後「abcd」。 我正在使用以下代碼來接收消息:使用套接字接收破/不完整的消息
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
switch (streamEvent) {
case NSStreamEventNone:
NSLog(@"Stream event none");
break;
case NSStreamEventOpenCompleted:
NSLog(@"Stream opened");
break;
case NSStreamEventHasBytesAvailable:
if (theStream == inputStream) {
int len=0;
uint8_t *buffer = (uint8_t *)calloc(1, (16*1024));
while ([inputStream hasBytesAvailable]) {
len = [inputStream read:buffer maxLength:sizeof(buffer)];
NSLog(@"byte available %d",len);
if (len > 0) {
NSMutableData* data=[[NSMutableData alloc] initWithLength:0];
//
[data appendBytes:(const void *)buffer length:len];
// NSString *s = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
// NSLog(@"rs %@",s);
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
if (nil != output) {
NSLog(@"server said: %@", output);
[self messageReceived:output];
}
}
}
}
break;
case NSStreamEventHasSpaceAvailable:
NSLog(@"event space available");
break;
case NSStreamEventErrorOccurred:
NSLog(@"Can not connect to the host!");
break;
case NSStreamEventEndEncountered:
NSLog(@"end");
[theStream close];
[theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[theStream release];
theStream = nil;
break;
default:
NSLog(@"Unknown event");
}
}
我可能是錯的,但不應該sizeof(緩衝區)返回指針的大小而不是緩衝區的大小?我的意思是,分配是動態的...另一點,當你分配你的NSMutableData時,爲什麼當你知道最終長度(len)時,它的長度爲0? – 2013-04-22 07:02:13
plz檢查這一個http://stackoverflow.com/questions/15583366/tcp-socket-programming-in-ios-server-client-response – 2013-04-22 07:14:41
那麼你建議我做什麼? @JeromeDiaz – 2013-04-22 07:14:56