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]. Это файл .m для программы, которую я пытаюсь написать, чтобы играть в MUD (текстовая игра). Входной поток представляет собой соединение с игровым сервером, который отправляет мою информацию о клиенте (байты). Байты преобразуются в строки каждый раз, когда происходит событие hasBytesAvailable. Эти байты затем отображаются в текстовом поле окна. Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда происходит событие, он заменяет то, что первоначально было на экране. Я попытался создать строку-заполнитель, которая содержала выходные данные, а затем добавила в эту строку для отображения. Кажется, он работает так, как я этого хочу. Я хотел бы иметь возможность постоянно получать данные из потока, которые будут отображаться по очереди непрерывно по всей программе. Я пробовал NSArray и NSMutableString ... Я не могу понять, как создать глобальную строковую переменную, которую я могу просто добавлять каждый раз, когда происходит событие hasBytesAvailable. Спасибо всем за чтение, и я надеюсь, что вы сможете помочь.Как правильно отобразить в NSTextView? NSString/NSInputStream/NSTextView

+0

Ну, если это так, то создайте insode-класс, который объявит ваш mutablestring и просто добавит inisde, который и установлен на экран –

+0

Это работало безупречно! Извините, поскольку я только учился программировать в течение нескольких недель. –

+0

Строка, которую я получаю с сервера сокета, помечена в HTML, что было бы хорошим способом создать класс для удаления тегов HTML и установить функции для фактических тегов, таких как и т. Д. ... –

ответ

0

Чтобы ответить на вопрос о разборе HTML-тегов. Посмотрите на NSXMLParser и NSXMLParserDelegate, чтобы проанализировать их самостоятельно. Else посмотрите на HTML parsing options

Смежные вопросы