0

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);
        }
4

2 に答える 2

1

Stream.Read() は受信したバイト数を返します。その後のバイトは未定義です。

于 2012-09-14T05:53:07.730 に答える
0

読み取るバイト/文字数をメッセージの前に付けます...

like: <整数><区切り文字><通常のメッセージ>

受信者側で、区切り文字の最初の一致を見つけてみてください...その区切り文字の前の部分のintを解析します...区切り文字の後のバイト/文字数を読み取ってみてください

于 2012-09-14T05:03:28.427 に答える