4

TCP接続アプリを試していましたが、handleEventでNSStreamEvent"4"を取得しています。私は何が間違っているのですか?

私のコードは、

-(void) initNetworkCommunication {

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", 80, &readStream, &writeStream);

inputStream = (__bridge_transfer NSInputStream *)readStream;
outputStream = (__bridge_transfer NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];

}


- (IBAction)didTapButton:(id)sender {

NSString *response  = inputTextField.text;
NSLog(@"%@", response);
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
[outputStream write:[data bytes] maxLength:[data length]];
}



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

  switch (streamEvent) {

    case NSStreamEventOpenCompleted:
        NSLog(@"Stream opened");
        break;

    case NSStreamEventHasBytesAvailable:
        NSLog(@"Stream has bytes available");

        break;          

    case NSStreamEventErrorOccurred:
        NSLog(@"Can not connect to the host!");
        break;

    case NSStreamEventEndEncountered:
        NSLog(@"Stream closed");

        break;

    default:

        NSLog(@"Unknown event: %@ : %d", theStream, streamEvent);
    }

  }

コンソールは、

2012-05-29 13:37:07.132 GestureTrial[24289:f803] Stream opened
2012-05-29 13:37:07.133 GestureTrial[24289:f803] Stream opened
2012-05-29 13:37:07.133 GestureTrial[24289:f803] Unknown event: <__NSCFOutputStream: 0x6b85c70> : 4

サーバーにメッセージを送信しようとしたとき。Mac用のtcpテスターアプリで試してみましたが、正常に動作しているので、ファイアウォールの問題ではない可能性があります。出力は、デバイスとシミュレータで同じです。どんな助けでも大歓迎です。

4

1 に答える 1

11

実際、あなたは何も悪いことをしていません。

このイベント(はNSStreamEventHasSpaceAvailable)は通常、ストリームに書き込んだ後、ストリームが再び書き込む準備ができていることを通知し、書き込み可能なストリームを開いた後に発生します。NSStreamクラスリファレンス、または正確には、ストリームイベント定数を参照してください。

演算子に慣れていない場合は<<、ビットを左にn桁シフトすることを意味します(各シフトは2を掛けることに相当します)。翻訳は次のようになります:

typedef enum {
   NSStreamEventNone = 0,
   NSStreamEventOpenCompleted = 1,
   NSStreamEventHasBytesAvailable = 2,
   NSStreamEventHasSpaceAvailable = 4,
   NSStreamEventErrorOccurred = 8,
   NSStreamEventEndEncountered = 16
};

多くのアプリケーションでは、このイベントは通常、ストリームに書き込んだ直後に発生するため、単に無視されます(処理されません)。何かがうまくいかない場合、あなたはNSStreamEventErrorOccurredまたはを取得NSStreamEventEndEncounteredし、これらはあなたが処理する必要があるものです。NSStreamEventHasSpaceAvailableさらにデータを送信しても問題がないことを示すフラグとして使用できます。

また、両方のストリーム(inputStreamとoutputStream)が同じデリゲートメソッドを呼び出していることも知っておく必要があります。そのため、最初に2つのNSStreamEventOpenCompletedイベントを取得します。しかし、多くの場合、これは問題にはならないはずです。必要に応じて、どのストリームがイベントの発信者であるかをいつでも確認できます。

于 2012-05-29T09:34:42.327 に答える