GCDAsyncSocket отправить сообщение

У меня проблемы с отправкой сообщений через сокет с помощью GCDAsyncSocket. Я устанавливаю соединение и пытаюсь отправить сообщение на сервер, но сообщение отправляется, когда приложение закрывается. Мне нужен способ сделать это раньше. Я пробовал [отключить asyncSocket]; но это ничего не изменило... Пожалуйста, помогите. Вот часть моего кода:

NSError *err = nil;
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
if(![asyncSocket connectToHost:@"localhost" onPort:7777 error:&err]){
// If there was an error, it's likely something like "already connected" or "no delegate set"
    NSLog(@"I goofed: %@", err);
}
NSString *requestStr = @"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><root><service>1</service><type>1</type><userProperties><username>someusername</username></userProperties></root>";
NSData *requestData = [requestStr dataUsingEncoding:NSUTF8StringEncoding];

[asyncSocket writeData:requestData withTimeout:1.0 tag:0];

NSData *receivedData;
[asyncSocket readDataToData:receivedData withTimeout:2.0 tag:0];
NSString *httpResponse = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
NSLog(@"%@",httpResponse);

person iblagajic    schedule 15.12.2011    source источник
comment
Также см. мой очень похожий вопрос с ответом: /   -  person khaliq    schedule 19.08.2012


Ответы (1)


Ваша проблема заключается в "readDataToData:receivedData" - вы просите GCDAsyncSocket считывать данные до тех пор, пока он не найдет "ничего" - полученные данные неизвестны. Обычно используется что-то вроде

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

Это будет читаться до тех пор, пока не будет получена комбинация CR/LF для завершения чтения. Вы также можете прочитать заголовок и определить длину считываемых данных.

Вам нужно сказать ему, когда вернуться из чтения (поэтому вы ничего не получите). Кроме того, он, вероятно, возвращается к вам только тогда, когда приложение закрывается, потому что сокет закрывается, когда приложение завершается.

person ferdil    schedule 16.12.2011