2

私のサーバーは次のデータを送信しています:

{
  "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;
        }
4

1 に答える 1

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データをバイナリ形式でコピーしています-1文字あたり2バイトです。これをまったく使用しないでください。Encoding.GetBytes適切なエンコーディングを選択して、単に使用してください...私はお勧めしEncoding.UTF8ます。受信側でも同じエンコーディングを使用してください。Encoding.GetString文字の途中で終わるデータを受け取る可能性があるため、そのまま使用できないことに注意してください(非 ASCII データがある場合)。

DataAvailableまた、メッセージが終了したかどうかの指標として使用しないことをお勧めします。同じストリームで複数のメッセージを送信する場合は、各メッセージに長さのプレフィックスを付けるか (おそらく最も簡単な方法)、特定のデータを使用してストリームの終わりを示す必要があります。

于 2013-03-27T21:11:36.410 に答える