1

私が構築してきたこのシステムのバグに頭を悩ませています。基本的に、ソケットを使用して 2 つの C# アプリケーション間の通信を行います。むしろ、Unity C# スクリプト サーバーと C# クライアント アプリケーションです。

手動テストでは、システムは完全に正常に動作し、異常はまったくありません。パフォーマンスとマルチユーザー機能をテストするために、複数のスレッド (クライアント) を起動するテスター クラスを作成し、それらがサーバーで X 量のメッセージを起動するようにしました。ここで私の問題が発生します...時々。

Socket が送信または受信すると、送受信されたバイト数を表す整数コンテナーが返されます。問題が発生すると、正しい量のバイトがサーバーに到着したことがわかります。ただし、バイトを文字列に挿入した後、通常ここに表示されるメッセージではなく、突然空の文字列が残ります。

この問題の原因がわかりません。Encoding.Default.GetString() を使用して、バイトを文字列に変換しています。

どんな助けでも大歓迎です!デビッド

public void ReceiveFromClient (Socket handlerSocket)
{
    serverBuffer = new byte[iBufferSize]; //iBufferSize = 8192;

    int i = handlerSocket.Receive (serverBuffer);
    Debug.Log ("Bytes received: " + i);

    string message = Encoding.UTF8.GetString (serverBuffer, 0, i);
    Debug.Log ("Message received: " + message);

    //Do stuff with the message

}

bool SendMessageToUnity(string input)
    {//returns a bool saying whether the message was sent or not
        if (clientSocket != null)
        {  
            if (clientSocket.Connected)
            {
                byte[] bytes = Encoding.UTF8.GetBytes(input+"|");
                txtOutput.BeginInvoke(new Action(() => txtOutput.AppendText("Sending message: " + Encoding.UTF8.GetString(bytes) + Environment.NewLine)));

                int i = clientSocket.Send(bytes);
                txtOutput.BeginInvoke(new Action(() => txtOutput.AppendText("Sending "+i+" bytes. "+ Environment.NewLine)));
                return true;
            }                
        }
        return false;
    }
4

2 に答える 2

0

バイト配列を文字列に変換する前に、ゼロ値 ('\0') を探してください。

private string GetString(byte[] data)
{
  data = data.Where(b => b != 0).ToArray();
  return Encoding.UTF8.GetString(data);
}
于 2013-08-22T12:27:42.873 に答える