0

我在使用 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);
4

1 回答 1

2

您的问题出在“readDataToData:receivedData”中 - 您要求 GCDAsyncSocket 读取数据,直到它发现“无” - receivedData 是未知的。通常使用类似的东西

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

它将一直读取,直到它获得一个 CR/LF 组合来终止读取。您还可以读取标题并确定要读取的数据的长度。

你需要告诉它什么时候从阅读中返回(这就是你什么都得不到的原因)。此外,它可能仅在应用程序退出时返回给您,因为应用程序终止时套接字正在关闭。

于 2011-12-16T01:08:15.197 回答