Возникли проблемы с программированием потоков

Итак, вот проблема: поток не пишет в нужное время и не может получить ответ от моего сервера. Я знаю, что пишу правильные данные, потому что, когда я останавливаю сборку, они записываются на сервер, и сервер доволен. Я в замешательстве, почему это не происходит в нужное время.

Я использую 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

person khaliq    schedule 17.08.2012    source источник


Ответы (2)


Вы читаете с этим:

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

Который ожидает CRLF в качестве разделителя потока. Но я не вижу, где вы добавляете его к своим JSONRequestData. Итак, измените ваши JSONRequestData, чтобы они были изменчивыми, например:

NSMutableData *JSONRequestData;

И затем перед этой строкой:

 

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

Добавь это:

[JSONRequestData appendData:[GCDAsyncSocket CRLFData]];
person user523234    schedule 18.08.2012
comment
Спасибо! Теперь я понимаю (прекрасное чувство, когда я понятия не имею, что делать) - person khaliq; 18.08.2012

При отправке коротких фрагментов данных всегда очищайте буфер после каждой записи, которая должна иметь немедленный эффект.
Я не вижу, чтобы вы делали это в своем коде.
Если вы этого не делаете не делайте этого, тогда буфер будет сбрасываться только тогда, когда он заполнен или поток закрыт.

person Germann Arlington    schedule 17.08.2012
comment
Я понимаю, что ты имеешь в виду. Единственная проблема заключается в том, что GCDAsyncSocket обрабатывает это сам, и поэтому нет способа очистить groups.google.com/forum/?hl=ru&fromgroups#!topic/ - person khaliq; 17.08.2012