所以这是问题所在: 流不是在正确的时间写入,并且无法从我的服务器获得响应。 我知道我正在编写正确的数据,因为当我停止构建时,它会写入服务器并且服务器很高兴。 我很困惑为什么在合适的时间没有发生这种情况。
我正在使用GCDAsyncSocket读取/写入套接字
我已经创建了一个单独的类来处理所有网络, 这是我的代码:
-(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
答案 0 :(得分:5)
你正在阅读:
[asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:2];
期望CRLF作为流的分隔符。但是我没有看到你将它附加到JSONRequestData的位置。因此,修改您的JSONRequestData是可变的,如下所示:
NSMutableData *JSONRequestData;
然后在这一行之前:
[asyncSocket writeData:JSONRequestData withTimeout:-1 tag:1];
添加:
[JSONRequestData appendData:[GCDAsyncSocket CRLFData]];
答案 1 :(得分:0)
在每次写入后发送短数据块始终刷新缓冲区时,您希望立即生效。
我不认为你在你的代码中这样做
如果不这样做,则只有当缓冲区已满或流已关闭时才会刷新缓冲区。