Java iPhone应用程序和后端通信
我在java Web服务器和iOS应用程序之间来回发送数据。当我发送单个请求时,效果很好。但是,当我从iPhone发送10个请求时(我的UITableView中每个单元格一个请求,需要唯一的信息),请求无法正常工作。让我解释一下发生了什么: 我的iOS应用程序正在使用服务器返回的数据创建NSData对象。我正在使用Java iPhone应用程序和后端通信,java,ios,objective-c,json,networking,Java,Ios,Objective C,Json,Networking,我在java Web服务器和iOS应用程序之间来回发送数据。当我发送单个请求时,效果很好。但是,当我从iPhone发送10个请求时(我的UITableView中每个单元格一个请求,需要唯一的信息),请求无法正常工作。让我解释一下发生了什么: 我的iOS应用程序正在使用服务器返回的数据创建NSData对象。我正在使用[NSJSONSerialization JSONObjectWithData]方法将其转换为一个NSDictionary。我收到一个错误,指出末尾有垃圾数据。当我检查缓冲区时,我看到
[NSJSONSerialization JSONObjectWithData]
方法将其转换为一个NSDictionary。我收到一个错误,指出末尾有垃圾数据。当我检查缓冲区时,我看到了我的第一个JSON字符串,但也附加了下一个JSON字符串
我如何解决服务器以一个字符串的形式发回请求的问题(因为它处理请求的速度太快了)
我正在使用Apple的NSStream类来处理通信
中的一些代码-
`(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent:`
case NSStreamEventHasBytesAvailable:
{
//can read input
if (theStream == inputStream) {
if (inputStream.hasBytesAvailable) {
uint8_t buf[4096];
unsigned int len = 0;
len = [inputStream read:buf maxLength:4096];
if(len > 0 && len < 4096) {
NSError *error;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[NSData dataWithBytes:buf length:len] options:NSJSONReadingAllowFragments error:&error];
if (error) {
与这样的单个请求不同:
{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abbott, Philip C","overall":2,"reviews":21}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abel, Gavin Paul","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abel, Steven Richard","overall":5,"reviews":1}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abney, Scott A","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abraham, Dulcy M","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abraham, John ","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abramova, Inna ","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abu-Omar, Mahdi M","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Acharya, Lalatendu ","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Acosta, Glen G","overall":0,"reviews":0}]}
{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abbott, Philip C","overall":2,"reviews":21}]}
{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abel, Gavin Paul","overall":0,"reviews":0}]}
AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id array) {
[processingQueue_ addOperationWithBlock:^{
[self.syncDelegate saveBigs:array];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self finished:title];
}];
}];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[self failed:title error:error retrySelector:@selector(getBigs) withObject:nil errorCode:operation.response.statusCode type:NETWORK_OPERATION_TYPE_BIG];
}];
[queue_ addOperation:operation];
……等等
如何将其拆分为每个JSON字符串?我有什么选择?我是否需要更改服务器发送数据的方式
服务器:
String request = commands[1];
String results = submitReview(request);
bw.write(results);
bw.flush();
我已经尝试通过它手动解析,但是当我有一个完整的请求(一个有效的JSON字符串)并附加了一个长的JSON字符串(因为它不适合缓冲区,所以无效,其余的将在下一个inputStream事件中发送)时遇到问题。有人有什么建议吗
非常感谢
-Kamran我对我的应用程序有着非常相似的需求,我们使用的是。它让我有多个流拉独立的数据块,真是太棒了。我知道,由于我们的多线程技术,我们的Android应用程序在性能上甚至无法接近我们 您可以将多个请求排队,然后让队列管理器在您希望同时执行的任意多个线程上执行这些请求,并获得成功和失败块 我们的设置如下:
{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abbott, Philip C","overall":2,"reviews":21}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abel, Gavin Paul","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abel, Steven Richard","overall":5,"reviews":1}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abney, Scott A","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abraham, Dulcy M","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abraham, John ","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abramova, Inna ","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abu-Omar, Mahdi M","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Acharya, Lalatendu ","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Acosta, Glen G","overall":0,"reviews":0}]}
{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abbott, Philip C","overall":2,"reviews":21}]}
{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abel, Gavin Paul","overall":0,"reviews":0}]}
AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id array) {
[processingQueue_ addOperationWithBlock:^{
[self.syncDelegate saveBigs:array];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self finished:title];
}];
}];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[self failed:title error:error retrySelector:@selector(getBigs) withObject:nil errorCode:operation.response.statusCode type:NETWORK_OPERATION_TYPE_BIG];
}];
[queue_ addOperation:operation];
如何下载数据?你试过使用AFNetworking这样的库吗?我只是编辑了这篇文章,因为我不小心漏掉了这个。我正在使用NSStream与我的服务器通信。我可能错了,但我认为问题不在于我如何处理前端的网络,而在于我的服务器如何不断发送数据。我认为聚合数据所使用的技术没有数据分散的方式那么重要。我仍然认为如果你去AFN,你的悲伤会少一些。