2012-08-10 2 views
-1

json 개체를 서버로 보내려고합니다. 하지만 오류가 발생하여 해결할 수 없습니다.NSJSONSerialization 오류

-(void) connectToHost{ 
CFReadStreamRef readStream; 
CFWriteStreamRef writeStream; 
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", 9123, &readStream, &writeStream); 
inputStream = (__bridge NSInputStream *)readStream; 
outputStream = (__bridge NSOutputStream *)writeStream; 
[inputStream setDelegate:self]; 
[outputStream setDelegate:self]; 
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[inputStream open]; 
[outputStream open]; } 

이것은 내 호스트와 연결됩니다.

NSDictionary *setUser = [NSDictionary 
      dictionaryWithObjectsAndKeys:[@"u" stringByAppendingString:my.id],@"id", 
             @"GET_USER_INFO",@"command", 
             @"",@"value", 
             nil]; 
    NSArray *array = [NSArray arrayWithObject:setUser]; 
    jsonDataToSendTheServer = [array JSONRepresentation]; 
    NSLog(@" %@ ", jsonDataToSendTheServer); 
    // array = [NSArray arrayWithObject:jsonDataToSendTheServer]; 
    NSLog(@" %@ ", array); 
    NSLog(@"true or false %c",[NSJSONSerialization 
           isValidJSONObject: array]); 

    bytesWritten = [NSJSONSerialization writeJSONObject:array toStream:outputStream options:NSJSONWritingPrettyPrinted error:nil]; 

이고이 부분은 NSJSONSerialization 부분입니다. 그러나 오류가 발생했습니다.

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***+[NSJSONSerialization writeJSONObject:toStream:options:error:]: stream is not open for writing' 

나는 objective-c에서 새삼입니다. 3 시간 동안 문제를 해결할 수 없습니다.

=======================================

편집 :

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { 

NSLog(@"stream event %i", streamEvent); //this doesn't post in the log when stream opened... 
NSLog(@"bytes %i",bytesWritten); 
switch (streamEvent) { 

    case NSStreamEventOpenCompleted: 
     NSLog(@"Stream opened"); 
     break; 
    case NSStreamEventHasBytesAvailable: 

     if (theStream == inputStream) { 

      uint8_t buffer[1024]; 
      int len; 

      while ([inputStream hasBytesAvailable]) { 
       len = [inputStream read:buffer maxLength:sizeof(buffer)]; 
       if (len > 0) { 

        NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding]; 

        if (nil != output) { 

         NSLog(@"server said: %@", output); 
         //[self messageReceived:output]; 

        } 
       } 
      } 
     } 
     break; 

    case NSStreamEventEndEncountered: 

     [theStream close]; 
     [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     //[theStream release]; 
     theStream = nil; 

     break; 
    case NSStreamEventHasSpaceAvailable: 
    { 
     uint8_t *readBytes = (uint8_t *)[_data mutableBytes]; 
     readBytes += bytesWritten; // instance variable to move pointer 
     int data_len = [_data length]; 
     unsigned int len = ((data_len - bytesWritten >= 1024) ? 
          1024 : (data_len-bytesWritten)); 
     uint8_t buf[len]; 
     (void)memcpy(buf, readBytes, len); 
     //len = [theStream write:(const uint8_t *)buf maxLength:len]; 
     NSLog(@"written %s", buf); 
     bytesWritten += len; 
    } 
     break; 

    case NSStreamEventErrorOccurred: 
    { 
     NSLog(@"no connection"); 
    } 
    case NSStreamEventNone: 
    { 
     //printf("EVENT: None.\n"); 
     break; 
    } 

    default: 
     NSLog(@"Unknown event"); 
}} 

이것은 내 스트림입니다. handleEvent : function.

delegate에 connectionToHost를 추가 한 후에 이런 종류의 오류가 발생합니다. 지금

012-08-10 16:14:27.302 TaraftarlikOyunu[2274:c07] written P∏◊P‡ˇø 

2012-08-10 16:14:28.399 TaraftarlikOyunu[2274:c07] benim bu id 587127341 

2012-08-10 16:14:28.399 TaraftarlikOyunu[2274:c07] benim ad Ahmet 

2012-08-10 16:14:28.400 TaraftarlikOyunu[2274:c07] 

[{"id":"u581277341","command":"GET_USER_INFO","value":""}] 


2012-08-10 16:14:28.404 TaraftarlikOyunu[2274:c07] stream event 4 

2012-08-10 16:14:28.404 TaraftarlikOyunu[2274:c07] bytes 86 

    (lldb) 

내가 버퍼링 경우 것이라는 생각이 없거나하지

======================= EDIT2 = ============== 죄송합니다. 문제는 아마 때문에 그냥 복사 코드의이 부분을 붙여이

(void)memcpy(buf, readBytes, len); 

이 나타납니다. 무엇이 문제 일 수 있습니다!

+0

당신이 확신에 일어난 있는지 확인해야합니다? 아주 특별한 조합. – Farcaller

+0

예 간단한 HTTP 요청을 수행해야합니다 –

+0

새로운 목표 C에 대해서는 NSURLConnection 및 NSURLRequest를 참조하십시오. 원하는 것 이상으로 네트워크 스트림 프로그래밍에 맞게 조정하십시오. –

답변

1

사용중인 연결 방법이 조금 있습니다.

당신은 원시 소켓에 JSON을 보낼 필요가, 연결이 위임

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { 

switch (streamEvent) { 
    case NSStreamEventHasSpaceAvailable: 
     NSLog(@\"None!\"); 
     break; 
    case NSStreamEventOpenCompleted: 
     NSLog(@\"Stream opened\"); 
       //NOW you can write to the stream 
관련 문제