网络流接收数据与'\ 0'混合

时间:2013-03-27 21:08:28

标签: c# encoding tcp networkstream

我的服务器正在发送以下数据:

{
  "command": 23
}

我的客户正在接收以下数据:

"{\0\r\0\n\0 \0 \0\"\0c\0o\0m\0m\0a\0n\0d\0\"\0:\0 \02\03\0\r\0\n\0}\0"

正如您所看到的,我正在接收发送的数据,但是那些\0与之混合在一起。 What is causing this?也许有编码的东西?

发送数据的服务器的方法:

public void GetBasicInfo()
        {
            JObject o = new JObject();

            o.Add(COMMAND, (int)Command.GetBasicInfo);

            byte[] package = GetBytes(o.ToString());
            System.Diagnostics.Debug.WriteLine(o.ToString());
            networkStream.Write(package, 0, package.Length);
            networkStream.Flush();
        }

private static byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
            return bytes;
        }

客户端读取数据的方法:

private void CommsHandler(TcpClient tcpClient)
        {
            NetworkStream networkStream = tcpClient.GetStream();

            while (true)
            {
                try
                {
                    string message = ReadResponse(networkStream);
                    System.Diagnostics.Debug.WriteLine(message);
                    ParseMessage(message);
                }
                catch (Exception)
                {
                    break;
                }

            }

            Logger.Log(LogType.Warning, "Communication with server closed");

            tcpClient.Close();
            SearchForServer();
        }

private static string ReadResponse(NetworkStream networkStream)
        {
            // Check to see if this NetworkStream is readable.
            if (networkStream.CanRead)
            {
                var myReadBuffer = new byte[256]; // Buffer to store the response bytes.
                var completeMessage = new StringBuilder();

                // Incoming message may be larger than the buffer size.
                do
                {
                    var numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
                    completeMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
                } while (networkStream.DataAvailable);

                return completeMessage.ToString();
            }
            return null;
        }

1 个答案:

答案 0 :(得分:10)

  

正如您所看到的,我正在接收发送的数据,但是那些\ 0与它混合在一起。是什么造成的?也许有编码的东西?

是。这是这种方法:

private static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

它以二进制形式复制char数据 - 每个字符两个字节。完全不要使用它 - 只需使用Encoding.GetBytes,选择合适的编码...我建议Encoding.UTF8。在接收方使用相同的编码。请注意,您不能只使用Encoding.GetString,因为您可能会收到在字符中间结束的数据(如果您有任何非ASCII数据)。

我还建议不要使用DataAvailable作为消息是否已完成的指示。如果您在同一个流上发送多条消息,则应对每条消息进行长度前缀(可能是最简单的方法),或者使用某些特定数据来指示流的结束。