NSOuputStream отправляет старое значение - цель C

Я создал код, используемый для сокетов для отправки/получения значения. Я сделал все это. первый раз работает хорошо. Я сталкиваюсь с проблемой: всякий раз, когда я отправляю новое значение во второй раз, передается старое значение. например, в первый раз, когда я отправляю значение 0 в сокет, файл журнала на стороне сокета принимается как «0» в файле журнала, и я получил данные от сервера, он работает хорошо. но когда я отправляю в сокет другое значение, например «2», но сокет сервера получает предыдущее значение как «0» в файле журнала. я не могу отправить новое значение.

Мой код

Appdelegate.h

@property (strong) NSInputStream *inputStream;
@property (strong) NSOutputStream *outputStream;

- (void) applicationDdifinishLaunching....{
[self initNetworkCommunication:@"192.168.1.38"];
}

Appdelegate.m

- (void) initNetworkCommunication:(NSString *) getIp {
NSLog(@"GETIP = %@",getIp);
CFStringRef aCFString = (__bridge CFStringRef)getIp;

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, aCFString, 1500, &readStream, &writeStream);
CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);

NSInputStream *inStream = (__bridge NSInputStream *) readStream;
NSOutputStream *outStream = (__bridge NSOutputStream *) writeStream;

[inStream setDelegate:self];
[outStream setDelegate:self];
[inStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inStream open];
[outStream open];

self.inputStream = inStream;
self.outputStream = outStream;
[self performSelectorInBackground:@selector(StartDatatoServer:) withObject:@"0"];
}



- (void) StartDatatoServer:(id) get
{
NSString *command = [NSString stringWithFormat:@"%@",get];
//NSData *datafixed = [[command stringByAppendingString:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *data = (NSMutableData *)[[command stringByAppendingString:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding];
unsigned long length = [data length];

uint8_t *readBytes = (uint8_t *) [data bytes];
uint8_t buffer[length];
(void)memcpy(buffer, readBytes, length);
length = [outputStream write:(const uint8_t *)buffer maxLength:length];
if (-1 == length) {
        NSLog(@"Error writing to stream %@: %@", outputStream, [outputStream streamError]);
} else {
        NSLog(@"Wrote %ld bytes to stream %@.", (long)length, outputStream);
}
[self writeLogFile:command TypeName:@"ServerStart"];
}




- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { 
switch (streamEvent) {
    case NSStreamEventOpenCompleted:
    {
        if ([theStream isKindOfClass:[inputStream class]]) {
            NSLog(@"Input stream opened");
        } else {
            NSLog(@"output stream opened");
        }
        break;
    }
    case NSStreamEventHasSpaceAvailable:
        NSLog(@"NSEvethaspcape");
        break;
    case NSStreamEventHasBytesAvailable:
        // Listening Server Acknowledgement
        NSLog(@"NSStreamEventHasBytesAvailable");
        if (theStream == inputStream) {
        }
        break;
    case NSStreamEventErrorOccurred:
         NSLog(@"NSStreamEventErrorOccurred");
        // When disconnect or Error occured between socket & server
        break;
    case NSStreamEventEndEncountered:
        // Occur when Server is Closed
        NSLog(@"NSStreamEventEndEncountered");
        [theStream close];
        [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        theStream = nil;
        break;
    default:
        NSLog(@"Unknown event");
}
}

В Windowcontroller.h

Объект = @"2";

-(void) LoginConnectionProcess:(id)anObject
{

AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate];
appDelegate.inputStream.delegate = self;
appDelegate.outputStream.delegate = self;

NSString *command = [NSString stringWithFormat:@"%@",anObject];
NSMutableData *data = (NSMutableData *)[[command stringByAppendingString:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding];
unsigned long length =
[data length];
NSLog(@"anOjbe= %@",command);
uint8_t *readBytes = (uint8_t *) [data bytes];
uint8_t buffer[length];
(void)memcpy(buffer, readBytes, length);
length = [appDelegate.outputStream write:(const uint8_t *)buffer maxLength:length];
if (-1 == length) {
    NSLog(@"Errors writing to stream %@: %@", appDelegate.outputStream, [appDelegate.outputStream streamError]);
} else {
    NSLog(@"Wrotes %ld bytes to stream %@.", (long)length, appDelegate.outputStream);
}
}


- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
switch (streamEvent) {
    case NSStreamEventOpenCompleted:
        NSLog(@"ConnectionOpened");
        break;
    case NSStreamEventHasSpaceAvailable:
        NSLog(@"NSStreamEventHasSpaceAvailable");
        break;
    case NSStreamEventHasBytesAvailable:
    {
        NSLog(@"NSStreamEventHasBytesAvailable");
        if (theStream == appDelegate.inputStream) {

        }
        break;
    }
    case NSStreamEventErrorOccurred:
        break;
    case NSStreamEventEndEncountered:
        [theStream close];
        [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        theStream = nil;
        break;
    default:
        NSLog(@"Unknown Events");
}
}

и всякий раз, когда я звонил во второй раз, функция потока «NSStreamEventHasSpaceAvailable» только запускалась. но функция "NSStreamEventHasBytesAvailable" никогда не вызывается. Что мне не хватает/проблема здесь. Ждем вашего ответа. Любая помощь. Заранее спасибо.


person Ravi Kumar Karunanithi    schedule 18.08.2014    source источник
comment
Код выглядит довольно гнилым. Почему вы сбрасываете делегатов потока? Почему во втором фрагменте кода не используется StartDatatoServer:? Зачем копировать объект NSData в буфер, если можно так же легко получить доступ к байтам непосредственно внутри объекта NSData?   -  person trojanfoe    schedule 18.08.2014
comment
@trojanfoe, тогда как я могу получить доступ к NSOuputstream для отправки данных, и мне нужно отправлять данные немедленно при открытии сокета   -  person Ravi Kumar Karunanithi    schedule 18.08.2014
comment
Любой код, который хочет отправить данные, может вызвать StartDataToServer:, и это будет взаимодействовать с потоками.   -  person trojanfoe    schedule 18.08.2014
comment
@trojanfoe хорошо. Я отправляю данные как 0 на сервер, когда соединение открывается, я заменяю этот код функцией NSStreamEventOpenCompleted. Все так же работает. я звонил только в первый раз. У меня есть одно сомнение. не могли бы вы уточнить, часто ли эта функция вызывается снова?   -  person Ravi Kumar Karunanithi    schedule 18.08.2014
comment
@trojanfoe Я снова использую тот же код, но с тем же результатом. Здесь   -  person Ravi Kumar Karunanithi    schedule 18.08.2014


Ответы (1)


Я только что вызвал следующий код, он будет сброшен

NSString *command = [NSString stringWithFormat:@"%@\r",username.StringValue];
NSData *data = [command dataUsingEncoding:NSUTF8StringEncoding];
[outputStream write:[data bytes] maxLength:[data length]];
person Ravi Kumar Karunanithi    schedule 13.10.2014