gpt4 book ai didi

C# Gzip 在服务器端错误地压缩字节数组

转载 作者:太空宇宙 更新时间:2023-11-03 15:12:15 25 4
gpt4 key购买 nike

我有一个问题。当我尝试将压缩文件 (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 连接,我只遇到大文件的问题,我可以在不压缩的情况下保存文件。

最佳答案

不知道为什么,sslstream中有一些特性。起初你只能得到 1 个字节(即使缓冲区大小大得多),你应该再次调用 Read 函数来读取剩余的字节。但这不是我的问题。调用一次读取函数可获得的最大缓冲区大小为16227

关于C# Gzip 在服务器端错误地压缩字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53612040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com