2013-01-19 35 views
0

我一直在尝试解决这个问题很长一段时间,这是一个相当恼人的问题。基本上,我有一个连接到服务器的XNA程序,并从它下载图片用作texture2D。在局域网中测试时一切正常,但当我将程序发送给朋友在WAN上进行测试时,映像最终会随机损坏。在大多数情况下,图像的开始在那里,但在那之后它只是相同的颜色。我已经尝试过所有可以找到的解决方案,但似乎没有任何解决方案能够解决它。这里是我的发送/接收图片代码:通过TCP发送图像时的损坏问题

客户

 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?

+1

两个字节数组是否相同?我认为可能发生的是一些字节被错误地解释为控制字符。解决方法是使用base64编码:Convert.ToBase64String或Convert.FromBase64String。 [点击查看为什么要使用Base64](http://stackoverflow.com/questions/201479/what-is-the-use-of-base-64-encoding) –

+0

此外,我也遇到了一个问题与.NET 4.0客户端和.NET 4.0服务器(但与.NET 4.5安装)。不知道这是否适用于此。只是说。 – SmartK8

+0

Hi @João,您可以通过[email protected]与我联系吗? –

回答

0

BrownishMonster在评论中解决了这个问题。

两个字节数组是否相同?我认为可能发生的是一些字节被错误地解释为控制字符。解决方法是使用base64编码:Convert.ToBase64String或Convert.FromBase64String。