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

但第二个字符串通过:

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

2 回答 2

1

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

于 2012-09-14T05:53:07.730 回答
0

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

比如:<整数><分隔符字符><普通消息>

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

于 2012-09-14T05:03:28.427 回答