2

DataAvailableがfalseの場合、すべてのデータがNetworkStreamから読み取られることを確認しますか?

または、データの送信者は最初にデータの長さを送信する必要がありますか。そして、送信者が指定したバイト数を読み取るまで読み取る必要がありますか?

サンペル:

private Byte[] ReadStream(NetworkStream ns)
{
    var bl = new List<Byte>();
    var receivedBytes = new Byte[128];
    while (ns.DataAvailable)
    {
            var bytesRead = ns.Read(receivedBytes, 0, receivedBytes.Length);
            if (bytesRead == receivedBytes.Length)
                bl.AddRange(receivedBytes);
            else
                bl.AddRange(receivedBytes.Take(bytesRead));
    }
    return bl.ToArray();
}
4

2 に答える 2

6

DataAvailable何がバッファリングされ、ローカルで利用可能かを示します。何が到着する可能性があるかという点では、まったく意味がありません。の最も一般的な使用法はDataAvailable、同期読み取りと非同期読み取りのどちらかを決定することです。

送信後にインバウンドストリームが閉じることを期待している場合はRead、肯定的でない結果が得られるまで使用を続けることができます。これにより、終了に達したことがわかります。彼らが複数のフレームを送信している場合、または単に閉じていない場合-はい:フレームの終わり(=論理メッセージ)を検出する何らかの方法が必要になります。これは、長さプレフィックスとカウントを介して行うことができますが、番兵値を介して行うこともできます。たとえば、テキストベースのプロトコルでは、\nまたは\r「メッセージの終わり」として解釈されることがよくあります。

つまり、プロトコルに完全に依存します。

于 2013-02-05T14:29:40.357 に答える
0

最も簡単な方法は開始/終了文字を使用することであるため、メッセージは次のようになります。

string message = "Hello";
string messageToSend = (char)2 + message + (char)3;
于 2013-02-05T14:32:21.890 に答える