C# での TCP ソケット通信は初めてで、クライアント アプリからネットワーク ストリームを介してデータを送信し、それをサーバー アプリから読み取るという問題があります。最初は問題なくデータが送信されますが、次にデータを送信しようとすると、古いデータがまだネットワーク ストリームに残っており、新しいデータの長さに応じて上書きされます。これにより、ストリーム内のデータを解析しようとすると問題が発生します。ヌル終端を追加しようとしましたが、効果がないようです。
さらにデータを送信する前にネットワーク ストリームを空にするにはどうすればよいですか?
次のような文字列を送信します。
1|0|bob|cornell|9/14/2012 12:49:34 AM
次に、次のような別のもの:
1|0|jim|horne|9/14/2012 12:49:34 AM
しかし、2 番目の文字列は次のようになります。
1|0|jim|horne|9/14/2012 12:49:34 AMAM
... の束が続き\0
ます。
最後のチャンクは DateTime であり、余分な AM が原因で文字列を DateTime に変換できません。ストリームを介して送信する文字列の末尾に \0 を追加しても機能しません。例えば:
1|0|jim|horne|9/14/2012 12:49:34 AM\0M
文字列の読み取りを停止する信号ではなく、ヌル終了を単なる別の文字として扱っているようです。
「フラッシュ」は NetworkStream タイプに対して何もしないようです。ここではばかげた問題に違いありませんが、助けていただければ幸いです。
クライアントはこれを行います:
private static void writeToServer(MessagePacket message, NetworkStream clientStream)
{
clientStream.Write(message.ToBytes(), 0, message.ToBytes().Length);
}
サーバーはこれを行います:
byte[] rawMessage = new byte[4096];
while (true)
{
try
{
clientStream.Read(rawMessage, 0, 4096);
clientStream.Flush();
}
catch
{
break;
}
newPacket = new MessagePacket(rawMessage);
}