无法编程stream

所以这里的问题是:stream没有在正确的时间写入,无法从我的服务器得到响应。 我知道我正在写正确的数据,因为当我停止构build时,它写入到服务器,服务器很高兴。 我很困惑,为什么这不是在正确的时间发生。

我正在使用GCDAsyncSocket读取/写入套接字

我做了一个单独的类来处理所有的networking,这里是我的代码:

-(id)init{ self = [super init]; if (self) { asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; NSError *error = nil; if (![asyncSocket connectToHost:@"localhost" onPort:8888 error:&error]) // Asynchronous! { // If there was an error, it's likely something like "already connected" or "no delegate set" NSLog(@"I goofed: %@", error); } } return self; } //GCD Async Delegate Methods - (void)socket:(GCDAsyncSocket *)sender didConnectToHost:(NSString *)host port:(UInt16)port { NSLog(@"socket:%p didConnectToHost:%@ port:%hu", sender, host, port); NSLog(@"Cool, I'm connected! That was easy."); } - (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag { if (tag == 1) NSLog(@"First request sent"); else if (tag == 2) NSLog(@"Second request sent"); //read data of custom length /* if (tag == TAG_FIXED_LENGTH_HEADER) { int bodyLength = [self parseHeader:data]; [socket readDataToLength:bodyLength withTimeout:-1 tag:TAG_RESPONSE_BODY]; } else if (tag == TAG_RESPONSE_BODY) { // Process the response [self handleResponseBody:data]; // Start reading the next response [socket readDataToLength:headerLength withTimeout:-1 tag:TAG_FIXED_LENGTH_HEADER]; } */ } -(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { NSError *error; serverJSONResponseParsed = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; } -(BOOL)sendString:(NSString *)sendString{ NSError *error; NSLog(@"Sending String: %@",sendString); NSDictionary *blobData = [NSDictionary dictionaryWithObjectsAndKeys: sendString,@"string", nil]; NSString *blobString = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:blobData options:kNilOptions error:&error] encoding:NSUTF8StringEncoding]; NSLog(@"Blob Created: %@", blobString); NSDictionary *requestData = [NSDictionary dictionaryWithObjectsAndKeys: @"send_string",@"request_type", [NSNumber numberWithInt:0],@"security_level", @"ios",@"device_type", //No Email Provided, This is just for testing blobString,@"blob", nil]; NSData *JSONRequestData = NULL; JSONRequestData = [NSJSONSerialization dataWithJSONObject:requestData options:kNilOptions error:&error]; NSLog(@"Contents of JSONRequestData: %@",[[NSString alloc] initWithData:JSONRequestData encoding:NSUTF8StringEncoding]); //Write the data [asyncSocket writeData:JSONRequestData withTimeout:-1 tag:1]; //read a response [asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:2]; NSDictionary *JSONResponseData = serverJSONResponseParsed; /* if (serverResponse != NULL) { JSONResponseData = [NSJSONSerialization JSONObjectWithData:serverResponse options:kNilOptions error:&error]; } */ NSString *failure = [JSONResponseData objectForKey:@"failure"]; if ([failure respondsToSelector:@selector(isEqualToString:)]) { NSLog(@"Unknown Object, Not a NSString"); } if ([failure isEqualToString:@"none"]) { NSLog(@"Success Sending String"); return TRUE; } else { NSLog(@"%@",failure); return FALSE; } } 

这是控制台所说的:

 2012-08-16 18:15:27.831 FlokMobile[4257:c07] Sending String: hello 2012-08-16 18:15:27.832 FlokMobile[4257:c07] Blob Created: {"string":"hello"} 2012-08-16 18:15:27.832 FlokMobile[4257:c07] Contents of JSONRequestData: {"security_level":0,"request_type":"send_string","device_type":"ios","blob":" {\"string\":\"hello\"}"} 2012-08-16 18:15:27.833 FlokMobile[4257:c07] (null) 2012-08-16 18:15:27.833 FlokMobile[4257:c07] It didn't work - appdel 2012-08-16 18:15:27.850 FlokMobile[4257:c07] socket:0x6992890 didConnectToHost:127.0.0.1 port:8888 2012-08-16 18:15:27.850 FlokMobile[4257:c07] Cool, I'm connected! That was easy. 2012-08-16 18:15:27.851 FlokMobile[4257:c07] First request sent 

你正在阅读这个:

 [asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:2]; 

哪一个期望CRLF作为stream的分隔符。 但是我没有看到你把它附加到你的JSONRequestData。 所以修改你的JSONRequestData是可变的,就像这样:

 NSMutableData *JSONRequestData; 

然后在这行之前:

 [asyncSocket writeData:JSONRequestData withTimeout:-1 tag:1]; 

添加这个:

 [JSONRequestData appendData:[GCDAsyncSocket CRLFData]]; 

发送短块数据时,每次写入后都要刷新缓冲区,以便立即生效。
我没有看到你在你的代码中这样做。
如果你不这样做,那么只有当缓冲区满或streamclosures时才会刷新缓冲区。