異常情況如下:按照正常的寫法,將上傳對數據封裝在nsdictionary里,然后檢驗是否符合json格式化,調用系統的json序列化方法將nsdictionary轉化為json數據然后上傳,
異常結果如下:,后臺只能收到收到nsdictionary的第一個{,后測試數據從nsdictionary的第一個{斷開了
由于控制臺打印的nsdictioanry數據如下
故猜測上傳數據時"/n"作為了數據的分隔符被切斷了,所以將nsdictionary轉化為nsstring并且將"/n"替換為空格然后發現數據無法上傳,最后追加了"/n"到nsstring末端,上傳成功
完整代碼如下:
#PRagma mark - GCDAsyncSocketDelegate
/** * 鏈接成功 * * @param sock sock實例 * @param host ip * @param port 端口 */-(void)socket:(GCDAsyncSocket *)sockdidConnectToHost:(NSString *)host port:(uint16_t)port{ NSLog(@"didConnectToHost"); // gpstype:2015 // name:賬號 // pswd:密碼 NSLog(sock.isConnected?@"YES":@"NO"); if (sock.isConnected) {/*
//nsstring上傳需要加"/n"分隔符方可上傳成功
[sock writeData:[@"ABCABCABCABCABCABC/n" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; */ NSDictionary* nsDictionaryUser=@{@"gpsinfo":@"Gpsinfo",@"pswd":self.passWord,@"other":@"666",@"gpstype":@2015,@"name":self.name}; if ([NSJSONSerialization isValidJSONObject:nsDictionaryUser]) { NSLog(@"isValidJSONObject"); NSError* error;
//先轉nsdata再轉nsstring是為了保證nsdictionary格式不變 NSData *nsDataUser= [NSJSONSerialization dataWithJSONObject:nsDictionaryUser options:NSJSONWritingPrettyPrinted error:&error]; NSString* json=[[NSString alloc] initWithData:nsDataUser encoding:NSUTF8StringEncoding];// NSLog(@"nsDictionaryUser:%@",json); json=[json stringByReplacingOccurrencesOfString:@"/n" withString:@""];
//空格根據情況可以不去掉 json=[json stringByReplacingOccurrencesOfString:@" " withString:@""]; json=[json stringByAppendingString:@"/n"]; NSLog(@"json:%@",json); [sock writeData:[json dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; //保持讀取的長連接 [sock readDataWithTimeout:-1 tag:0]; if (error) { NSLog(@"localizedDescription:%@",[error localizedDescription]); NSLog(@"localizedFailureReason:%@",[error localizedFailureReason]); } else { } } } }
數據上傳成功了,后臺可以根據數據返回數據了
新聞熱點
疑難解答