Question

Je travaille actuellement sur un jeu fait en C # XNA. Depuis que je dois envoyer un morceau énorme de données sur net (combat 96kb), je suis en utilisant une chaîne compresseur / décompresseur code, que je trouve sur Internet. Le code ressemble à ceci:

        public static string Compress(string text)
    {
        byte[] buffer = Encoding.UTF8.GetBytes(text);
        MemoryStream ms = new MemoryStream();
        using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
        {
            zip.Write(buffer, 0, buffer.Length);
        }

        ms.Position = 0;
        MemoryStream outStream = new MemoryStream();

        byte[] compressed = new byte[ms.Length];
        ms.Read(compressed, 0, compressed.Length);

        byte[] gzBuffer = new byte[compressed.Length + 4];
        System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
        System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);

        return Convert.ToBase64String(gzBuffer);
    }

    public static string Decompress(string compressedText)
    {
        byte[] gzBuffer = Convert.FromBase64String(compressedText);
        using (MemoryStream ms = new MemoryStream())
        {
            int msgLength = BitConverter.ToInt32(gzBuffer, 0);
            ms.Write(gzBuffer, 4, gzBuffer.Length - 4);

            byte[] buffer = new byte[msgLength];

            ms.Position = 0;
            using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
            {
                zip.Read(buffer, 0, buffer.Length);
            }

            return Encoding.UTF8.GetString(buffer);
        }
    }

Il fonctionne comme ceci: - Server compresse la chaîne en utilisant le compresseur de chaîne, où après l'avoir envoyé au client. -. Le client reçoit la chaîne compressée, et décomprimer il est donc utilisable

Maintenant, la partie est bizarre, que le code fonctionne quand je teste le jeu seul, ce qui signifie que je lance le serveur et le client sur la même machine. Il fonctionne également lorsque je teste avec mon ami, où il héberge le serveur, et je connecter. Mais il ne fonctionne pas pour mon ami quand je suis héberge le serveur et il se connecte. Quand il se connecte à mon serveur, il reçoit "Index hors de portée" à "int msgLength = BitConverter.ToInt32 (gzBuffer, 0);". Parfois, il est chanceux et obtient, mais la plupart du temps, il échoue et renvoie cette erreur. Peut-il que le serveur ne reçoit pas l'ensemble ENVOYÉ chaîne? J'utilise gen3 Lidgren de réseau émettrice et la chaîne comprimé est envoyé en tant netMsg.Write (compressedstring);

Toutes les idées :)? Merci!

Était-ce utile?

La solution

Vous faites la même hypothèse incorrecte dans plusieurs endroits: que Stream.Read renverra toutes les données que vous avez demandé en une seule fois. Vous ne tenez pas compte de la valeur de retour. Ne pas le faire ... il est vrai, il devrait être correct pour MemoryStreams, en supposant qu'il ya assez dataAdditionally, vous pouvez utiliser la méthode MemoryStream.ToArray pour convertir en un tableau d'octets.

Maintenant, vous n'avez pas montré comment le client reçoit la chaîne - où vous obtenez vers

?

Vous devez connecter la chaîne que le serveur envoie, et la chaîne que le client reçoit. C'est la première étape absolue, de sorte que vous pouvez voir si les données ont effectivement été conservés.

Je soupçonne que le client tente de décompresser une chaîne vide - à savoir que Convert.FromBase64 retourne un tableau d'octets vide -. Mais jusqu'à ce que vous savez la chaîne qui est en cours de réception, il est difficile de faire des progrès

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top