C# NetworkStream.GetStream()返回意外结果

C# NetworkStream.GetStream()返回意外结果,c#,networkstream,C#,Networkstream,returndata[0]应该是一个由2个字符“fs”组成的字符串。 使用switch()或if()时,它从不匹配“fs”。 当我尝试返回数据[0]时,“fs”应该是2长度。长度是10025。。。 但是当我调试.WriteLine()时,它只显示“fs”。。 请帮忙 编辑: 接收到的数据按如下方式发送: NetworkStream serverStream = clientSocket.GetStream(); byte[] inStream = new byte[10025]; server

returndata[0]应该是一个由2个字符“fs”组成的字符串。 使用switch()或if()时,它从不匹配“fs”。 当我尝试返回数据[0]时,“fs”应该是2长度。长度是10025。。。 但是当我调试.WriteLine()时,它只显示“fs”。。 请帮忙

编辑: 接收到的数据按如下方式发送:

NetworkStream serverStream = clientSocket.GetStream();
byte[] inStream = new byte[10025];
 serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
 string[] delim = {"!###!"};
 string[] returndata = System.Text.Encoding.ASCII.GetString(inStream).Split(delim, StringSplitOptions.RemoveEmptyEntries);

您的字节缓冲区是10025。这是最后的决定,它永远不会改变。接收的字节数在
Read
方法的返回值中,您完全忽略了该返回值。因此,从
GetString
获取的字符串包含所有10025个字符,只有在打印出来时才忽略零


在任何情况下,这都不是正确的TCP。它无论如何都不会工作,也不会可靠。除非你真的知道自己在做什么,否则尽量避免编写TCP代码——看看WCF、HTTP或Lindgren——这可能比编写自己的TCP代码要好得多。

\0值?字符串是否用空值填充以匹配长度?如果它回答了您的问题,则进行编辑:/i发送字符串,不手动添加任何内容,仅通过if进行匹配(returndata[0]=“fs”)啊,我在你原来的帖子中漏掉了一点:你希望它的长度是10025,因此它的长度是10025。我想请你看看这里:你的一般方法注定要失败,因为TCP/IP是基于流的,而不是基于包的。这意味着您可以接收不包含分隔符的字符串,因为它们在中间被分割。您的代码需要更复杂才能处理该问题——或者您可以将字符串设置为基于行的,并将
网络流
包装在
流阅读器
中。有人能告诉我这个方法是否处理了您刚才所说的“拆分”数据包吗?这个项目看起来非常适合处理分割的流etc@user3916429。只要需要获取整个消息,您就需要重复读取(带偏移量)。在那之后,你需要确保你在缓冲区中存储了剩余的额外数据。您发送的链接不是糟糕的TCP,它在这样一个简单的情况下可以很好地工作。但它只会一次读取整个内容,类似于HTTP的工作方式。如果您需要保持连接处于活动状态并随时间发送(和读取)多个命令,它将不起作用-它将一直读取,直到客户端关闭套接字。NitoAsync是一个很棒的库,但我认为它对TCP没有帮助,只是异步套接字。
byte[] outStream = System.Text.Encoding.ASCII.GetBytes("fs!###!somethingsblabalkla");
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();