【发布时间】:2013-01-19 12:51:43
【问题描述】:
我已经尝试解决这个问题很长一段时间了,这是一个相当烦人的问题。基本上,我有一个 XNA 程序,它连接到服务器并从中下载图片以用作纹理 2D。在 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 上出现上述问题?
【问题讨论】:
-
两个字节数组一样吗?我认为可能发生的事情是某些字节被错误地解释为控制字符。解决这个问题的方法是使用 base64 编码:
Convert.ToBase64String或Convert.FromBase64String。 Click to see why to use Base64 -
此外,我还遇到了 .NET 4.0 客户端和 .NET 4.0 服务器(但安装了 .NET 4.5)的问题。不确定这是否适用于此。只是说。
-
嗨@João,您可以通过 eminakbulut@gmail.com 与我联系吗?
-
@BrownishMonster 这帮助我解决了我的问题,抱歉我没有早点感谢你,但非常感谢!
-
@JoãoMiguelBrandão 不客气。我会把它作为答案,但我的评论实际上只是一个猜测。这是我读到的东西,解决了我的一个问题,我的问题与 TCP 无关,但我听说它们是相关的。
标签: c# image tcp client-server corruption