C#Network Stream读取后仍包含旧数据

时间:2012-09-14 04:41:04

标签: c# .net sockets stream

C#中的TCP套接字通信新手,遇到问题我从客户端应用程序通过网络流发送一些数据,然后从我的服务器应用程序中读取它。第一次数据很好,但是下次我尝试发送数据时,旧数据仍然在网络流中,只是被新数据的长度覆盖。尝试解析流中的数据时,这会导致问题。我试过添加一个null终止但它似乎没有任何效果。

如何在发送更多数据之前清空网络流?

我们发送一个这样的字符串:

1|0|bob|cornell|9/14/2012 12:49:34 AM

然后另一个像这样:

1|0|jim|horne|9/14/2012 12:49:34 AM

但是第二个字符串是:

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

似乎将空终止视为另一个字符,而不是停止读取字符串的信号。

似乎“Flush”对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);
        }

2 个答案:

答案 0 :(得分:1)

Stream.Read()返回接收的字节数,之后的字节是未定义的。

答案 1 :(得分:0)

在消息前面加上要读取的字节数/字符数...

喜欢:<整数>< delimeter char><正常消息>

在接收器端,尝试找到delimeter char的第一个匹配...在该分隔符之前解析部件中的int ...尝试读取分隔符后的字节数/字符数