0

私はかなり長い間この問題を解決しようとしてきましたが、かなり面倒です。基本的に、サーバーに接続し、そこから画像をダウンロードして texture2D として使用する XNA プログラムがあります。LAN でテストするとすべて正常に動作しますが、プログラムを友人に送信して WAN でテストすると、イメージがランダムに破損してしまいます。ほとんどの場合、画像の始まりはそこにありますが、その後は同じ色です。私は周りで見つけることができるすべての解決策を試しましたが、何も解決していないようです。写真を送受信するための私のコードは次のとおりです。

クライアント

        NetworkStream nws = tcpcl.GetStream();
        while (true)
        {
            byte[] buffer = new byte[1024*1024*5];
            int buffpos = 0;
            while (nws.DataAvailable == false) Thread.Sleep(50);
            while (nws.DataAvailable == true)
            {
                buffer[buffpos] = (byte)nws.ReadByte();
                buffpos++;
            }

            byte[] actData = new byte[buffpos];
            for (int I = 0; I < buffpos; I++)
            {
                actData[I] = buffer[I];
            }

            string message = ASCIIEncoding.ASCII.GetString(actData);
            string ID = message.Substring(0, 1);
            string data = message.Substring(1);
            if (actData[0] == 1)
            {
                int namelength = BitConverter.ToInt32(actData, 1);
                byte[] _name= new byte[namelength];
                Array.Copy(actData, 5, _name, 0, namelength);
                string name = ASCIIEncoding.ASCII.GetString(_name);

                int avatarlength = BitConverter.ToInt32(actData, 5 + namelength);
                byte[] avatar = new byte[avatarlength];
                Array.Copy(actData, 9 + namelength, avatar, 0, avatarlength)
                    ;
                File.WriteAllBytes("content/" + name + ".png", avatar);

                FileStream fs=  File.OpenRead("Content/" + name + ".png");
                User _user = new User(name, Texture2D.FromStream(GraphicsDevice, fs));
                fs.Close();

                User.AddUser(_user);
            }
        }

サーバ

                us.endpoint = new IPEndPoint(groupEP.Address, groupEP.Port);
                us.gameenabled = true;
                us.x = Game.spawnx;
                us.y = Game.spawny;

                byte[] player_avatar = Game.playerAvatar(us.Username);
                byte[] setup= new byte[5+player_avatar.Length];

                setup[0] = (byte)maxcls;
                BitConverter.GetBytes(player_avatar.Length).CopyTo(setup, 1);
                player_avatar.CopyTo(setup, 5);

                NetworkStream nws = us.clientsock.GetStream();
                nws.Write(setup, 0, setup.Length);

効率は別として、WAN 経由で上記の問題を引き起こす可能性のあるコードはありますか?

4

1 に答える 1

0

BrownishMonster はコメントで問題を解決しました。

2 バイト配列は同じですか? 一部のバイトが制御文字として誤って解釈されている可能性があると思います。これを回避するには、base64 エンコーディングを使用します: Convert.ToBase64String または Convert.FromBase64String。

于 2014-10-29T15:26:29.530 に答える