2015-11-21 3 views
0

J'ai une application C#.Erreurs aléatoires lors de la réception de données d'image de mon serveur

Il télécharge des images sur mon serveur et les télécharge si nécessaire.

Ceci est mon client:

sb.Clear(); 
sb.Append(GeneralTags.ACTION_ADD); 
sb.Append(Shared.DLE); 
sb.Append("GALLERY"); 
sb.Append(Shared.DLE); 
sb.Append(Shared.CurrentClientId); 
sb.Append(Shared.DLE); 
sb.Append(JsonConvert.SerializeObject(gallery)); 
sb.Append(Shared.DLE); 
byte[] byteArray = System.Web.HttpUtility.UrlEncodeToBytes(sb.ToString()); 
int packetCount = 0; 

using (TcpClient clientSocket = new TcpClient()) 
{ 
    clientSocket.Connect(GeneralTags.RASPBERRY_PI_IP_ADDRESS, GeneralTags.RASPBERRY_PI_PORT); 
    using (NetworkStream serverStream = clientSocket.GetStream()) 
    { 
     serverStream.Write(byteArray, 0, byteArray.Length); 
     serverStream.Flush(); 

     List<byte> requestInBytes = new List<byte>(); 

     if (serverStream.CanRead) 
     { 
      int i = 0; 
      Byte[] bytesIn = new Byte[1024]; 
      do 
      { 
       i = serverStream.Read(bytesIn, 0, bytesIn.Length); 
       byte[] receivedBuffer = new byte[i]; 
       Array.Copy(bytesIn, receivedBuffer, i); 

       if (packetCount == 0) 
       { 
        packetCount = BitConverter.ToInt32(receivedBuffer, 0); 
       } 
       requestInBytes.AddRange(receivedBuffer); 
      } while (packetCount < requestInBytes.Count); 

      serverStream.Close(); 


      var json = Encoding.UTF8.GetString(requestInBytes.ToArray(), 0, requestInBytes.ToArray().Length); 
      var galleryback = JsonConvert.DeserializeObject<Gallery>(json); 

      using (MemoryStream ms = new MemoryStream()) 
      { 
       System.Diagnostics.Debug.WriteLine("BACK: " + galleryback.ImageData.Length.ToString()); 
       ms.Write(galleryback.ImageData, 0, galleryback.ImageData.Length); 
       Shared.ViewImage(Image.FromStream(ms, true)); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Local Device Error"); 

     } 
    } 
} 

Ceci est mon objet de classe:

public class Gallery 
{ 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public byte[] ImageData { get; set; } 
    public bool IsUploaded { get; set; } 
    public Int64 GalleryId { get; set; } 
    public string JobRef { get; set; } 
} 

Si nous supposons que mon serveur envoie toute la matrice de données lues correctement (je l'ai vérifié les octets envoyés du serveur avec les octets reçus par mon client) ...

Je reçois ce type d'erreur:

Unterminated string. Expected delimiter: ". Path 'ImageData', line 1, position 5515. 

Unexpected character encountered while parsing value: �. Path '', line 0, position 0. 

Comment puis-je résoudre ce problème?

grâce

Répondre

0

Il semble que vous envoyez un tableau d'octets avec le JSON sérialisé seulement une partie de celui-ci (vous ajoutez d'autres choses à la chaîne, comme GeneralTags.ACTION_ADD et ainsi de suite), mais quand vous recevez des données vous essayer de désérialiser le tout. Bien sûr, puisque vous n'avez pas de données au format JSON, cela signifie que DeserializeObject ne peut pas analyser les données qui lui ont été transmises. Vous devez extraire l'objet sérialisé d'une manière ou d'une autre, par exemple en utilisant regex ou un calcul impliquant des sous-chaînes.

+0

Salut merci pour votre observation. J'ai commencé par utiliser un objet Jason et utiliser un objet image. Mais l'image ne s'est jamais bien passée. On m'a dit que Json ne fonctionne pas bien avec les images. Je pensais donc le télécharger en tant que tableau d'octets –

+0

Salut, je suis loin de mon PC, mais je vais regarder cela à l'arrière. Merci –

+0

@AndrewSimpson Je ne pense pas que le problème réside dans l'utilisation d'un tableau d'octets. Ce que je dis est que la chaîne encodée à partir du tableau a plus d'informations que 'DeserializeObject' devrait être appelée avec. – Kapol