System.Text.Encoding.ASCII.GetBytes字符串转换后缺少charachters

时间:2015-07-28 17:33:13

标签: c# json string sockets bytearray

我正在将一个json字符串转换为bytes数组,以通过socket发送它。

这就是我的所作所为:

byte[] byData = System.Text.Encoding.ASCII.GetBytes(Data);
mySocket.Send(byData);

这是一个普通的Json字符串,甚至没那么久。但是当我在客户端收到字符串时,它会被截断。

示例:

我发送字符串 -command [{“ID”:2821},{“ID”:2823},{“ID”:2827},{“ID”:2829}(这里有更多记录)]这将是字符串变量“Data”在上面显示的代码中。

我得到了一半,在第1021个字符处被截断。

那是关于字节转换限制的吗?

发生了什么事?

编辑:

接收代码:

System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
                streamWriter.WriteLine(msg);
                streamWriter.Flush();

                // Use the following code to send bytes
                byte[] byData = System.Text.Encoding.ASCII.GetBytes(msg);
                if(m_clientSocket != null){
                    m_clientSocket.Send (byData);
                }

在bydata转换中截断数据。

此外,数据每次发送1023个字节,导致多个截断的字符串组成大字符串。

我是否需要自己重构字符串,或者还有其他方法

1 个答案:

答案 0 :(得分:2)

您无法忽略Send的返回值 - 它会告诉您实际发送了多少数据。您有责任发布另一个Send剩余数据。

当然,同样适用于另一端 - Receive将返回实际读取的数据量。

要记住的另一件事是TCP使用数据流而不是消息。如果您需要发送消息,则需要自己的消息框架(例如,为数据添加长度前缀,以便您知道消息何时结束)。

作为旁注,我避免使用Encoding.ASCII - 它会抛弃任何不在7位ASCII字符集中的字符。 Encoding.UTF8对于ASCII数据的行为相同,但它也会正确处理 ASCII的任何内容。唯一的缺点是你不能再依赖于字符和字节之间的1:1映射。

如果您不确切知道自己在做什么,就要避免像这样处理低级网络 - 对于大多数应用来说,TCP仍然太低。我强烈建议尝试像WCF或Lidgren这样的东西。如果您坚持使用原始TCP,请至少指出我制作的TCP客户端 - 服务器示例 - https://github.com/Luaancz/Networking。第二部分应该适合你。请注意,这仍然会忽略大多数错误处理,但否则会正确处理TCP - 尽管我必须强调它仍在进行中。使用它作为灵感,而不是生产就绪代码。