我的服务器正在发送以下数据:
{
"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;
}
答案 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
作为消息是否已完成的指示。如果您在同一个流上发送多条消息,则应对每条消息进行长度前缀(可能是最简单的方法),或者使用某些特定数据来指示流的结束。