#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
그럼이 경우라면 mutablestring을 선언하고 그냥 inisde를 추가하고 화면에 설정하는 싱글 톤 클래스 insode를 만드십시오. –
완벽하게 작동했습니다! 실례지만, 지금은 몇 주 동안 프로그램을 배웠습니다. –
소켓 서버에서받는 문자열에 HTML 태그가 지정되어 있는데, HTML 태그를 제거하고 실제 태그에 대한 함수를 등과 같이 설정하는 클래스를 만드는 좋은 방법은 무엇입니까? –