9

古いネットワーク カメラを自分のコンピュータに接続しようとしていますが、非常に基本的な問題で立ち往生しています。つまり、ストリームの終わりを検出することです。

カメラと通信するために を使用TcpClientしていますが、実際にカメラがコマンド データを送信しているのを見ることができます。ここでは問題ありません。

        List<int> incoming = new List<int>();            
        TcpClient clientSocket = new TcpClient();
        clientSocket.Connect(txtHost.Text, Int32.Parse(txtPort.Text));
        NetworkStream serverStream = clientSocket.GetStream();
        serverStream.Flush();

        byte[] command = System.Text.Encoding.ASCII.GetBytes("i640*480M");
        serverStream.Write(command, 0, command.Length);

ただし、応答を読み返すと、問題が始まります。最初は、次のコードのような単純なものが機能すると考えていました。

        while (serverStream.DataAvailable)
        {
            incoming.Add(serverStream.ReadByte());
        }

しかし、そうではなかったので、今回は ReadByte() を利用して別のバージョンを試してみました。説明には次のように記載されています。

ストリームから 1 バイトを読み取り、ストリーム内の位置を 1 バイト進めるか、ストリームの末尾にある場合は -1 を返します。

だから私は次の行に沿って何かを実装できると思った:

        Boolean run = true;
        int rec;
        while (run)
        {
            rec = serverStream.ReadByte();

            if (rec == -1)
            {
                run = false;
                //b = (byte)'X';
            }
            else
            {
                incoming.Add(rec);
            }

        }

いいえ、まだ機能しません。データが入ってくるのを実際に見ることができます (常に同じであるとは限りません。それ以外の場合は、毎回その数のバイトを単純に読み取ることができます) 0。残りの要素の値として取得を開始し、停止しません。手動で実行を停止するまで。外観は次のとおりです。 データ

だから私の質問は、ここで何か基本的なことが欠けていますか? ストリームの終わりを検出するにはどうすればよいですか?

どうもありがとう、

H.

4

2 に答える 2

17

欠けているのは、TCPデータストリームについてどのように考えているかです。これは、開いている電話回線のように開いている接続です。相手の誰かが話している場合と話していない場合があります(DataAvailable)。息を吸うために一時停止したからといって()、DataAvailable==false実際に現在の状態で完了しているわけではありません。声明。しばらくして、彼らは再び話し始めることができました(DataAvailable==true

TCPを超える通信プロトコルには、実際には単なるトランスポート層である、ある種の定義済みルールが必要です。たとえば、現在の画像送信が完了すると、カメラから特殊文字シーケンスが送信される可能性があります。そのため、送信されたすべての文字を調べて、そのシーケンスが送信されたかどうかを判断し、適切に動作する必要があります。

于 2011-06-29T15:15:32.897 に答える
2

ネットワーク通信でEOSを正確に言うことはできません(相手が接続を切断しない限り)通常、プロトコル自体には、メッセージが完了したことを知らせる何かが含まれています(たとえば、新しい行など)。したがって、ストリームを読み取ってバッファをフィードし、これらの戦略を適用して完全なメッセージを抽出します。

于 2011-06-29T15:10:33.697 に答える