Frage

Zur Zeit arbeite ich an einem gewissen Spiel gemacht in C # XNA. Da ich einen großen Teil der Daten über Netz (Kampf 96kb) senden müssen, verwende ich eine Schnur Kompressor / Dekompressor-Code, die ich im Internet gefunden. Der Code sieht wie folgt aus:

        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);
        }
    }

Es funktioniert wie folgt: - Server komprimiert die Zeichenkette mit String-Kompressor, wo, nachdem es an den Client gesendet. -. Der Kunde erhält die komprimierte Zeichenfolge, und entpacken Sie es, damit es nutzbar ist

Nun ist die seltsame Teil ist, dass der Code funktioniert, wenn ich das Spiel alleine bin testen, was bedeutet, dass ich den Server und Client auf demselben Rechner laufen. Es funktioniert auch, wenn ich mit meinem Freund mich entschieden, wo er den Server hostet, und ich verbinde. Aber es funktioniert nicht für mein Freund, wenn ich den Server bin Hosting und er verbindet. Als er auf meinen Server verbindet, erhält er "Index out of range" auf "int msgLength = BitConverter.ToInt32 (gzBuffer, 0);". Manchmal ist er Glück und bekommt in, aber meistens versagt es und kehrt, dass Fehler. Kann es sein, dass der Server nicht die gesamte Zeichenfolge abgeschickt zu bekommen? Ich bin mit Lidgren gen3 für Netzwerk zu senden, und die komprimierte Zeichenfolge gesendet wird als netMsg.Write (compressedstring);

Alle Ideen :)? Dank!

War es hilfreich?

Lösung

Sie machen die gleiche falsche Annahme an mehreren Stellen: dass Stream.Read alle Daten angezeigt werden können Sie auf einmal gefragt haben. Sie ignorieren den Rückgabewert. Tu das nicht ... allerdings soll es für MemoryStreams in Ordnung sein, vorausgesetzt, es ist genug dataAdditionally, können Sie die MemoryStream.ToArray Methode verwenden, um eine Byte-Array zu konvertieren.

Jetzt haben Sie nicht gezeigt, wie der Client die Zeichenfolge empfängt - wo bist du es davon ab,

?

Sie sollten die Zeichenfolge einzuloggen, dass der Server sendet und die Zeichenfolge, dass der Client empfängt. Das ist der absolute erste Schritt, so dass Sie, ob die Daten tatsächlich erhalten haben sehen können.

Ich vermute, dass der Client versucht, eine leere Zeichenfolge zu dekomprimieren - das heißt, dass Convert.FromBase64 einen leeren Byte-Array zurückkehrt -. Aber bis Sie die Zeichenfolge wissen, die empfangen sind sind, ist es schwer, Fortschritte zu machen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top