Domanda

Attualmente sto lavorando su qualche gioco fatto in C # XNA. Da quando ho bisogno di inviare un pezzo enorme di dati su rete (attacco 96kb), io sto usando un po '/ codice decompressore compressore stringa, che ho trovato su internet. Gli sguardi codice come questo:

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

Funziona in questo modo: - Server comprime la stringa utilizzando compressore stringa, dove dopo l'invio al client. -. Il cliente riceve la stringa compressa e decomprimere in modo che sia utilizzabile

Ora la parte strana è, che il codice funziona quando sto testando il gioco da solo, il che significa che eseguire il server e il client sulla stessa macchina. Funziona anche quando sto testando con il mio amico, dove ospita il server, e mi collego. Ma che non funziona per il mio amico quando Sto ospitando il server e si connette. Quando si collega al mio assistente, egli riceve "Index out of range" a "int msgLength = BitConverter.ToInt32 (gzBuffer, 0);". A volte è fortunato e si mette in, ma soprattutto non riesce e restituisce questo errore. Può essere che il server non è sempre tutta inviati stringa? Sto usando Lidgren Gen3 per l'invio della rete, e la stringa compressa viene inviato come netMsg.Write (compressedstring);

Tutte le idee :)? Grazie!

È stato utile?

Soluzione

Stai facendo lo stesso presupposto errato in più posti: che Stream.Read restituirà tutti i dati che hai chiesto in una sola volta. Si sta ignorando il valore di ritorno. Non fare così ... devo ammettere che dovrebbe essere a posto per MemoryStreams, supponendo che non c'è abbastanza dataAdditionally, si consiglia di utilizzare il metodo MemoryStream.ToArray da convertire in un array di byte.

Ora, non hai dimostrato come il cliente riceve la stringa - dove state ottenendo da

?

Si deve registrare la stringa che il server invia, e la stringa che il cliente riceve. Questo è il primo passo in assoluto, in modo da poter verificare se i dati sono in realtà stato preservato.

Ho il sospetto che il cliente sta cercando di decomprimere una stringa vuota - vale a dire che Convert.FromBase64 restituisce un array di byte vuoto -. Ma fino a quando si sa la stringa che è in fase di ricezione, è difficile fare qualche progresso

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top