1

CFStream を使用して IOS ソケット クライアントを構築しています。テスト サーバーに接続し、そこからメッセージを受信することができました。問題は、クライアントがメッセージを送信した場合、サーバーはそれを受信できず、その後、クライアントはサーバーからメッセージを受信しません。私のコードは次のとおりです。何が間違っている可能性がありますか?

- (void)initCommunicationWithAddress:(NSString*) address withPort:(int) port
{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)address, port, &readStream, &writeStream);

    self.inputStream = (__bridge_transfer NSInputStream *)readStream;
    self.outputStream = (__bridge_transfer NSOutputStream *)writeStream;

    [self.inputStream setDelegate:self];
    [self.outputStream setDelegate:self];
    [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [self.inputStream open];
    [self.outputStream open];
    NSLog(@"Socket Init: %@", @"");
}

- (void)sendMessage:(NSString*)msg
{
    msg =  @"hello";
    NSLog(@"SendMessage: %@", msg);
    NSData *data = [[NSData alloc] initWithData:[msg dataUsingEncoding:NSASCIIStringEncoding]];
    [self.outputStream write:[data bytes] maxLength:[data length]];
}

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

    switch (streamEvent) {

        case NSStreamEventOpenCompleted:
            [self streamOpened];
            break;

        case NSStreamEventHasBytesAvailable:
            NSLog(@"Stream Bytes Available:%@", @"");
            if (theStream == self.inputStream) {

                NSMutableData* data = [NSMutableData data];
                uint8_t buffer[1024];
                int len;
                int bytesRead = 0;

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

                        [data appendBytes:(const void *)buffer length:len];
                        bytesRead = bytesRead + len;
                    }
                }

                NSString* output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

                if (nil != output) {
                    [self HandleServerMessage: output];

                }
            }
            break;

        case NSStreamEventErrorOccurred:
             NSLog(@"Stream Error:%@", @"");
            [self streamError];
            break;

        case NSStreamEventEndEncountered:
            NSLog(@"Stream Event End:%@", @"");
            [theStream close];
            [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [self streamEnd];
            break;

        default:
            NSLog(@"Unknown event");
    }
}
4

1 に答える 1

1

私は自分の間違いを理解しました。サーバーにメッセージを送信する前に、NSStreamEventHasSpaceAvailableイベントを待つか、空き容量があるかどうかを確認する必要があります。

于 2012-12-21T15:46:11.050 に答える