3

TCP ストリームを開いて、cocoa アプリでデバイスと通信しようとしています。ウェブを検索したところ、それを行う可能性がいくつかあることがわかりましたが、少し行き詰まっています。

私は NSStream の方法を使用することにしました (cocoa-touch で参照されているため、アプリを iPhone に移植したい場合に役立つと思います)、私のコードは次のとおりです。

@implementation AppDelegate

- (IBAction)connect:(id)sender {

    [NSStream getStreamsToHost:"192.168.1.4" port:23 inputStream:&inputStream outputStream:&outputStream];

    [inputStream setDelegate:self];
    [outputStream setDelegate:self];

    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

    [inputStream open];
    [outputStream open];
}

// Both streams call this when events happen
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
    if (aStream == inputStream) {
        [self handleInputStreamEvent:eventCode];
    } else if (aStream == outputStream) {
        [self handleOutputStreamEvent:eventCode];
    }
}

- (void)handleInputStreamEvent:(NSStreamEvent)eventCode
{
    switch (eventCode) {
        case NSStreamEventHasBytesAvailable:[self readBytes];
            break;
        case NSStreamEventOpenCompleted:
            // Do Something
            break;
        default:
        case NSStreamEventErrorOccurred:
            NSLog(@"An error occurred on the input stream.");
            break;
    }

}

したがって、接続ボタンをクリックすると、ホストへのストリームが開かれ、2 つのオブジェクト (inputstream と outputstream) が作成されます。

私が到達したい最初のステップは、inputStream を NSTextView に入れ、ホストに到達したかどうかを知ることです...しかし、私はまだ立ち往生しています:(

誰かが私の道を照らすことができれば、それは素晴らしいことです! 私はスタック オーバーフローの初心者であり、私がよく知っていることでコミュニティを助けてくれることをうれしく思います! :)


私は自分のコードを更新し、光が来ているようです. texviewで「こんにちは」を取得しました。ここで、コマンドをサーバーに送信できるようにユーザーとパスワードを送信したいと思いますが、「ユーザーとパスを送信」ボタンのコードは次のとおりです。

- (IBAction)sendusername:(id)sender {

    NSString * usernameMsg  = [NSString stringWithFormat:@"user @", [usernameField stringValue]];
    NSData * usertosend = [[NSData alloc] initWithData:[usernameMsg dataUsingEncoding:NSUTF8StringEncoding]];
    [outputStream write:[usertosend bytes] maxLength:[usertosend length]];

}

私の検索に従うと、サーバーは「user +ok」などの応答を返すはずですが、何も応答しません... 2つの奇妙なこと:-SSHサーバーのFTPサーバーへのソケットを開くと、常に「hello」応答がありません問題。しかし、telnet では、接続の 90% が「ÿýÿýÿûÿû」のような奇妙なこんにちはを返します。なぜですか?

  • ユーザーを送信すると、何も起こらず、ハンドルイベントからの認識されていないイベントのみが発生します...
4

1 に答える 1

0

https://github.com/robbiehanson/CocoaAsyncSocket/を見ることをお勧めします。これは、BSD ソケット用の優れた Objective-C ラッパーです。これにより、イベント ループでの送受信インタラクションを適切でクリーンなコールバック方法で処理できます (カスタムの「メッセージ終了」シンボルも処理できるため、受信したものを結合および分割するのではなく、実際のパケット処理に集中することができます)。ワイヤーから)。

于 2012-08-08T10:56:30.933 に答える