NetworkStreamから読み込んでいるバイト配列があります。最初の2バイトは後続のパケットの長さを示し、次にパケットはその長さのバイト配列に読み込まれます。NetworkStream / byte配列から読み取る必要があるデータには、いくつかの文字列があります。つまり、改行文字で終了する可変長データと、bytesやlongsなどの固定幅フィールドがあります。だから、このようなもの:
// I would have delimited these for clarity but I didn't want
// to imply that the stream was delimited because it's not.
StringbyteStringStringbytebytebytelonglongbytelonglong
私は出くわすデータパケットのフォーマットを知っています(そしていくつかの意見があります)、そして私がする必要があるのは各文字列値の「行」を読み取ることですが、バイトとロングの固定数のバイトを読み取ります。これまでのところ、私の提案する解決策は、while
ループを使用して、改行文字ができるまでバイトを一時バイト配列に読み込むことです。次に、バイトを文字列に変換します。これは私には不器用に思えますが、別の明白な方法はわかりません。私は使用できることを認識していますStreamReader.ReadLine()
が、それは別のストリームを含み、私はすでにを持っていNetworkStream
ます。しかし、それがより良い解決策である場合、私はそれを試してみます。
私が検討したもう1つのオプションは、バックエンドチームに、これらの文字列値の長さに対して1バイトまたは2バイトを書き込んでもらい、長さを読み取ってから、指定された長さに基づいて文字列を読み取ることです。
ご覧のとおり、これを実行する方法についていくつかのオプションがあります。それを実行するための最良の方法を検討する方法について、ご意見をお聞かせください。これが、パケット全体を文字列として読み取るために今持っているコードです。次のステップは、パケットのさまざまなフィールドを分割し、パケット内のデータに基づいてオブジェクトの作成、UIの更新など、実行する必要のある実際のプログラミング作業を実行することです。
string line = null;
while (stream.DataAvailable)
{
//Get the packet length;
UInt16 packetLength = 0;
header = new byte[2];
stream.Read(header, 0, 2);
// Need to reverse the header array for BitConverter class if architecture is little endian.
if (BitConverter.IsLittleEndian)
Array.Reverse(header);
packetLength = BitConverter.ToUInt16(header,0);
buffer = new byte[packetLength];
stream.Read(buffer, 0, BitConverter.ToUInt16(header, 0));
line = System.Text.ASCIIEncoding.ASCII.GetString(buffer);
Console.WriteLine(line);
}