在 iOS 中通过 GCDAsyncsocket 读取 xml 文件
Posted
技术标签:
【中文标题】在 iOS 中通过 GCDAsyncsocket 读取 xml 文件【英文标题】:Reading a xml file over GCDAsyncsocket in iOS 【发布时间】:2015-03-30 20:28:50 【问题描述】:我在这里停留在一个非常基本的概念上。我一直在为我的项目使用 GCDAsyncsocket。这是客户端的请求响应类型,其中我通过套接字从服务器(基于 Java)获取 xml 文件,我读取此文件将其保存在 App 的文档目录中,解析发送给其他人的请求标签,获取对相应请求的响应和将其写入一个 xml 文件,在每个请求之后附加响应并将其发送回服务器。
我尝试读取文件,但我想以字节为单位获取数据,我无法将该数据解码为适当的格式有人可以帮助我了解如何通过套接字(GCDAsyncsocket)读取 xml 文件并将其保存到我的应用文档目录
这是我一直在使用的基本代码:- - (IBAction)connect:(id)sender
NSString *hostAddress = self.serverTextfield.text;
uint16_t port = PORT;
_delegateQueue = dispatch_queue_create("com.a.cs.delegateQueue", NULL);
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:_delegateQueue];
DDLogInfo(@"Connecting to %@ on port %hu...", hostAddress, port);
NSError *error = nil;
if (![asyncSocket connectToHost:hostAddress onPort:port error:&error])
DDLogError(@"Oops Error Connecting.. %@",error);
self.notificationTextView.text = @"Oops Error Connecting";
else
DDLogVerbose(@"Connected");
self.notificationTextView.text = @"Connected";
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *uniqueID = [defaults objectForKey:@"UUID"];
NSLog(@"%@",uniqueID);
NSUInteger len = [uniqueID lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
Byte buffer[2];
buffer[0] = (0xff & (len >>8));
buffer[1] = (0xff & (len));
NSMutableData *outData = [NSMutableData dataWithCapacity:2];
[outData appendBytes:buffer length:2];
[outData appendData:[uniqueID dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"%@",outData);
[asyncSocket writeData:outData withTimeout:-1 tag:0];
[asyncSocket readDataWithTimeout:-1 tag:0];
这是我在单击名为“连接”的按钮时调用的操作方法。我写出一些数据将其发送到服务器并开始读取数据,在委托 didReadData 中我对从服务器接收到的数据进行操作并再次调用 [sock readDataWithTimeout:-1 tag:0];使其不断监听读取的数据...
现在,我期待的不是从服务器获取的字符串数据,而是我的服务器将发送给我的 XML 文件。我如何读取该文件并对其进行操作?另外,我如何将文件发送回我保存在我的应用程序文档目录中的服务器..任何帮助将不胜感激..
【问题讨论】:
你没有给我们什么继续。通过说您“尝试读取文件”,我担心您没有阅读 GCDAsyncSocket 文档、“入门”和“常见陷阱”,而是希望 GCDAsyncSocket 具有您错过的神奇“readXMLstream”方法。因为它没有,所以读取文件的概念不适用于您与库交互的级别。您使用的是哪种 -readData... 方法?你用这些数据做什么?是的,GCDAsyncSocket 只看到数据,而不是对数据的更高层次的理解。 @tobinijm - 我已经更新了我上面的帖子...抱歉耽搁了!! 感谢您提供更多信息。一般来说,*** 是为了回答更多“为什么这段代码出错?”的具体问题。或者“为什么我的观点总是黑色的,即使我是......”比关于方法或代码审查的问题更多样化。我认为您在处理发送给您的 XML 数据方面寻求帮助,但您没有提供该代码。说这对你不是很有帮助,所以我要贴一个“答案”,可以在cmets之外继续对话。 你的 GCDAsyncDelegate 读取数据的方法是什么样的? 【参考方案1】:如果您还没有的话,我首先要看的是 GCDAsyncSocket 包含在下载中的 SimpleHTTPClient 项目。 XML doctype 是 HTTP 数据包中的有效负载,因此它是一个适合您的模型的项目。
也就是说,您确定您的代码正在向您的服务器发送服务器所期望的内容吗?它只期望一个 UTF8 字符串 UUID?它不希望 UUID 被包装在 XML 中吗?服务器是否以一种您可以看到它正在获取它所期望的内容并且实际上正在返回给您的 XML 的方式记录传入的连接请求?
【讨论】:
@tobinjim- 我已经调查过了...但这不是我需要的...我只需要一种方法可以将文件从客户端(ios)发送到服务器(Java)反之亦然,使用 GCDAsyncSocket.. 我的最终目标是比较 XML 的哪个服务器有,以及我在最后操作后发送的。那么你能不能更具体一点,让我知道我是如何做到这一点的。我真的被困在这里了。 嗯,你确定 a) Java 服务器理解了你的请求,b) 发回了你期望的内容,c) GCDAsyncSocket 已经把它放在你期望的数据缓冲区中了吗?如果你知道所有这些都是真的,我认为你想要 NSXMLParser 类,从 -initWithData: 调用开始,传入 GCDAsyncSocket 为你填充的 NSData。以上是关于在 iOS 中通过 GCDAsyncsocket 读取 xml 文件的主要内容,如果未能解决你的问题,请参考以下文章
iOS Socket/Tcp编程 GCDAsyncSocket的实战(带回调)