2013-10-26 2 views
0
#import "AppDelegate.h" 





@implementation AppDelegate 
@synthesize inputStream; 
@synthesize outputStream; 
@synthesize textField; 
@synthesize window; 
@synthesize aText; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    [self initNetworkCommunication]; 

} 

- (void)initNetworkCommunication { 
    CFReadStreamRef readStream; 
    CFWriteStreamRef writeStream; 
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"tec.skotos.net", 6730, &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]; 
    NSString *response = [NSString stringWithFormat:@"/\\/connect: n/a!!n/a"]; 
    NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
    NSString *end = @"\n"; 
    NSData *endData = [[NSData alloc] initWithData:[end dataUsingEncoding:NSASCIIStringEncoding]]; 
    [outputStream write:[data bytes] maxLength:[data length]]; 
    [outputStream write:[endData bytes] maxLength:[endData length]]; 



} 



- (IBAction)sendMessage:(id)sender { 
    NSString *response = [textField stringValue ]; 
    NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
    NSString *end = @"\n"; 
    NSData *endData = [[NSData alloc] initWithData:[end dataUsingEncoding:NSASCIIStringEncoding]]; 
    [outputStream write:[data bytes] maxLength:[data length]]; 
    [outputStream write:[endData bytes] maxLength:[endData length]]; 
} 


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

    switch (streamEvent) { 

     case NSStreamEventOpenCompleted: 
      NSLog(@"Stream opened"); 
      break; 
     case NSStreamEventHasSpaceAvailable: 
      NSLog(@"Has space"); 
      break; 

     case NSStreamEventHasBytesAvailable: 

      if (theStream == inputStream) { 
       uint8_t buffer[900000]; 
       long len; 

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

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

         NSLog(@"Has Bytes"); 
         if (nil != output) { 
          NSLog(@"%@", output); 
          [window setString:output]; 



         } 
        } 
       } 
      } 
      break; 

     case NSStreamEventEndEncountered: 
      NSLog(@"Error."); 
      break; 

    } 

} 

@end 

그래서 [window setString : output] 메서드를 변경하는 멋진 방법을 찾고 있습니다. 이것은 MUD (텍스트 기반 게임)를 재생하기 위해 작성하려고하는 프로그램의 .m 파일입니다. inputstream은 내 클라이언트 정보 (바이트)를 보내는 게임 서버에 대한 연결을 나타냅니다. hasBytesAvailable 이벤트가 발생할 때마다 바이트가 문자열로 변환됩니다. 이 바이트는 윈도우의 텍스트 필드에 표시됩니다. 내가 겪고있는 문제는 이벤트가 발생할 때마다 처음에는 화면에 있던 것을 대체한다는 것입니다. 출력 데이터를 담고있는 자리 표시 자 문자열을 작성하여 표시 할 문자열에 추가하려고했습니다. 내가 원하는 방식대로 작동하지 않는 것 같습니다. 프로그램 전체에서 지속적으로 한 줄씩 표시 할 스트림에서 데이터를 지속적으로 가져올 수 있기를 바랍니다. 나는 NSArray 및 NSMutableString을 시도했습니다 ... hasBytesAvailable 이벤트가 발생할 때마다 추가 할 수있는 전역 문자열 변수를 만드는 방법을 알아낼 수 없습니다. 모든 것을 읽어 주셔서 감사 드리며 도와 드리겠습니다.NSTextView에 올바르게 표시하려면 어떻게해야합니까? NSString/NSInputStream/NSTextView

+0

그럼이 경우라면 mutablestring을 선언하고 그냥 inisde를 추가하고 화면에 설정하는 싱글 톤 클래스 insode를 만드십시오. –

+0

완벽하게 작동했습니다! 실례지만, 지금은 몇 주 동안 프로그램을 배웠습니다. –

+0

소켓 서버에서받는 문자열에 HTML 태그가 지정되어 있는데, HTML 태그를 제거하고 실제 태그에 대한 함수를 등과 같이 설정하는 클래스를 만드는 좋은 방법은 무엇입니까? –

답변

0

HTML 태그 구문 분석에 대한 질문에 답변하십시오. NSXMLParserNSXMLParserDelegate을 살펴보고 직접 구문 분석하십시오. 다른 것을 보시길 바랍니다 HTML parsing options

관련 문제