服务器中收到的消息不准确

时间:2015-09-26 10:49:29

标签: c# winforms client-server networkstream

我在客户端 - 服务器中接收消息时遇到问题。我已经为测试设置了一个默认字符串。它接收消息就好了但是当它发送第二个循环时它将字符串粘在一起。我该怎么办?

这是代码 发送数据(客户端)

NetworkStream networkStream = tcpclnt.GetStream();
String data = "";
     for (int i = 0; i < 4; i++)
         {
           data = " output here";
           if (networkStream.CanWrite)
              {
                var bytes = Encoding.ASCII.GetBytes(data);
                networkStream.Write(bytes, 0, bytes.Length);
                networkStream.Flush();
              }
          }

此时它收到数据(服务器)

private void recieveData()
{
  NetworkStream nStream = tcpClient.GetStream();
  while (!stopReceiving)
      {
         if (nStream.CanRead)
           {
              byte[] buffer = new byte[1024];
              var bytesRead = nStream.Read(buffer, 0, buffer.Length);
              if (bytesRead > 0) recvDt = Encoding.ASCII.GetString(buffer, 0, bytesRead);
              bool f = false;
              f = recvDt.Contains("+@@+");
                    if (f)
                    {
                        string d = "+@@+";
                        recvDt = recvDt.TrimStart(d.ToCharArray());
                        clientDis();
                        stopReceiving = true;
                    }


                    else 
                    {
                        this.Invoke(new rcvData(addHere));
                    }
                }
                Thread.Sleep(1000);
            }

        }


public void addHere() 
        {
            if (recvDt != null && recvDt != "")
            {
                output.Text += "Received Data: " + recvDt;
                recvDt = null;
            }

        }

输出看起来像这样

1 个答案:

答案 0 :(得分:2)

您假设TCP保留了您的消息。它不是。 TCP提供无边界字节流。您可以接收任何块大小的字节,包括一个,但也包括所有字节。

您需要设计一个应用程序协议,该协议允许您将消息与该字节流分开。也许,在邮件前加上它的长度。

或者,按行发送并使用StreamReader.ReadLine。它为你处理这个。

这是一个错误:

                    string d = "+@@+";
                    recvDt = recvDt.TrimStart(d.ToCharArray());

你基本上正在修剪所有字符“+ @”。不是你想要的。

您为什么要测试CanReadCanWrite?众所周知,它们是真实的,即使它们是假的,你的程序也会忽略这个问题并继续无所事事。如果你无法处理结果,不要做那样的迷信检查。

可能你根本不应该使用TCP。这个很难(硬。使用更高级别的技术,如WCF,HTTP,protobuf。