C # Gzip неправильно сжимает массив байтов на стороне сервера - PullRequest
0 голосов
/ 04 декабря 2018

У меня проблема.Когда я пытаюсь отправить сжатый файл (byte []) на сервер, и когда он распаковывается, файлы не совпадают друг с другом.Я думал, проблема в функциях сжатия, но мой клиент может сжать и распаковать массив байтов на его стороне.Итак, вот код:

Соединение с сервером (на стороне клиента):

private void ConnectToServer() {
        try {
            _client = new TcpClient(_address, _port);
            _stream = new SslStream(_client.GetStream(), true,
                new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
            try {
                _stream.AuthenticateAsClient(_address);
                _stream.Write(new byte[]{1});
            } catch (AuthenticationException ex) {
                _iClient.ExceptionHandler(ex);
                _client.Close();
            }
        } catch (SocketException ex) {
            _iClient.ExceptionHandler(ex);
            _iClient.SuccessfulConnectionHandler();
            Environment.Exit(0);
        }
    }
}

Прием клиента (на стороне сервера):

private static void SetupServer() {
        try {
            IPAddress ipAddress;
            if (!IPAddress.TryParse(_address, out ipAddress)) ipAddress = Dns.GetHostAddresses(_address)[0];
            _listener = new TcpListener(ipAddress, _port);
            _listener.Start();
            WriteLine("\b\b\b - Успешно;");
            WriteLine("Ожидание подключений...");

            while (true) {
                var client = _listener.AcceptTcpClient();
                var sslStream = new SslStream(client.GetStream(), true);
                try {
                    sslStream.AuthenticateAsServer(new X509Certificate(_certificate, _password),
                        false, SslProtocols.Tls, true);
                    WriteLine("{0} : [{1}] Успешное подключение",
                        DateTime.Now.ToString(CultureInfo.InvariantCulture),
                        (client.Client.RemoteEndPoint as IPEndPoint)?.Address);
                    new Thread(() => ProcessClient(client, sslStream)).Start();
                } catch (AuthenticationException e) {
                    sslStream.Close();
                    client.Close();
                } 
            }
        } catch (Exception ex) {
            WriteLine(ex.Message);
            WriteLine(ex.StackTrace);
        } finally {
            _listener?.Stop();
        }
    }

И мои функции сжатия:

byte[] Compress1(byte[] data) {
        using (var compressedStream = new MemoryStream())
        using (var zipStream = new GZipStream(compressedStream, CompressionMode.Compress)) {
            zipStream.Write(data, 0, data.Length);
            zipStream.Close();
            return compressedStream.ToArray();
        }
    }

    byte[] Decompress1(byte[] data) {
        using (var compressedStream = new MemoryStream(data))
        using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        using (var resultStream = new MemoryStream()) {
            zipStream.CopyTo(resultStream);
            return resultStream.ToArray();
        }
    }

Итак.Почему это случилось?

А вот дополнительная информация: я использую ssl-соединение, у меня проблемы только с большими файлами, я могу сохранять файлы без сжатия.

1 Ответ

0 голосов
/ 05 декабря 2018

Не знаю почему, но в sslstream есть некоторые особенности.Сначала вы можете получить только 1 байт (даже если размер буфера намного больше), и вы должны прочитать оставшийся байт, еще раз вызвав функцию Read.Но это не моя проблема.Максимальный размер буфера, который вы можете получить, вызвав функцию чтения один раз, составляет 16227

...