Pregunta

Actualmente estoy trabajando en un juego realizado en C # XNA. Desde que necesita enviar una gran parte de los datos sobre la red (pelea 96kb), estoy usando algunos / código de cadena compresor descompresor, que encontré en el Internet. Los código es el siguiente:

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

Funciona de esta manera: - Server comprime la cadena de usar el compresor de cuerdas, donde después de enviarlo al cliente. -. El cliente recibe la cadena comprimida y descomprimir, así que es utilizable

Ahora lo raro es, que el código funciona cuando estoy probando el juego solo, lo que significa que ejecutar el servidor y el cliente en la misma máquina. También funciona cuando estoy probando con mi amigo, donde se aloja el servidor, y enlaces. Pero que no está funcionando para mi amigo cuando estoy aloja el servidor y se conecta. Cuando se conecta a mi servidor, que recibe "Índice fuera de rango" en el "int msgLength = BitConverter.ToInt32 (gzBuffer, 0);". A veces se tiene suerte y entra, pero sobre todo se produce un error y devuelve ese error. ¿Es posible que el servidor no está recibiendo toda la cadena enviado? Estoy usando Lidgren Gen3 para el envío de la red, y la cadena comprimida es enviada como netMsg.Write (compressedstring);

Todas las ideas :)? Gracias!

¿Fue útil?

Solución

Estás haciendo la misma suposición incorrecta en varios lugares: Stream.Read que devolverá todos los datos con lo solicitado en una sola vez. Estás ignorando el valor de retorno. No hagas eso ... la verdad es que debería estar bien para MemoryStreams, suponiendo que hay suficiente dataAdditionally, es posible que desee utilizar el método MemoryStream.ToArray para convertir a una matriz de bytes.

Ahora, usted no ha demostrado cómo el cliente está recibiendo la cadena - donde está usted recibiendo desde

?

Se debe registrar la cadena que envía el servidor, y la cadena que el cliente recibe. Ese es el primer paso absoluta, para que pueda ver si los datos en realidad se ha conservado.

Sospecho que el cliente está tratando de descomprimir una cadena vacía - es decir, que Convert.FromBase64 devuelve un conjunto de bytes vacía -., Pero hasta que no sepa la cadena que está siendo recibido, es difícil hacer ningún progreso

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top