#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
Ну, если это так, то создайте insode-класс, который объявит ваш mutablestring и просто добавит inisde, который и установлен на экран –
Это работало безупречно! Извините, поскольку я только учился программировать в течение нескольких недель. –
Строка, которую я получаю с сервера сокета, помечена в HTML, что было бы хорошим способом создать класс для удаления тегов HTML и установить функции для фактических тегов, таких как и т. Д. ... –