【发布时间】:2014-08-20 11:30:10
【问题描述】:
我正在尝试通过套接字使用 GzipStream。为此,我使用了类似的东西。
using System.IO.Compression;
TcpClient _client = null;
// ...
// ... Connection
NetworkStream networkStream = _client.GetStream();
GZipStream zip = new GZipStream(networkStream, CompressionMode.Compress);
当我发送消息时,我使用 GZipStream 方法、Write 和 Flush:
zip.Write (....);
zip.Flush();
问题是当我运行 Flush 方法时没有发送消息。只有当我关闭 GZipStream(运行 GZipStream 类的 Close 方法)时才会发送消息。
我正在尝试这种方法:
using (GZipStream zip = new GZipStream(networkStream, CompressionMode.Compress))
{
zip.Write (....);
}
但是,当 zip 类超出使用范围并被释放(关闭)时,networkStream 实例也被关闭和释放。
如何避免这种行为?我在实时应用程序中运行它,我需要在 GZipStream 需要时发送消息。
有什么想法吗?
谢谢。
更新:
我已经创建了一个完整的片段。
using (var client = new TcpClient("127.0.0.1", 1514))
{
var networkStream = client.GetStream();
client.SendBufferSize = 1;
client.NoDelay = true;
using (Stream zip = new GZipStream(networkStream, CompressionMode.Compress, true))
{
byte[] dgram = CreateMessage("Testing line 1");
zip.Write(dgram, 0, dgram.Length);
}
networkStream.Flush();
// Next using block don't send anything. The server side does't receive anything.
// No exception is raised. It seems ok, but anything is sent
using (Stream zip = new GZipStream(networkStream, CompressionMode.Compress, true))
{
byte[] dgram = CreateMessage("Testing line 2");
{
zip.Write(dgram, 0, dgram.Length);
}
}
networkStream.Flush();
}
【问题讨论】: