如何将流写入内存流?

时间:2011-09-23 13:24:15

标签: c# .net

public void doprocess(TcpClient client)
{    
    MemoryStream ms = new MemoryStream();

    Stream clStream = client.GetStream();

    byte[] buffer_1 = new byte[8192];

    int count = clStream.Read(buffer_1, 0, buffer_1.Length);

    while (count > 0)
    {
        ms.Write(buffer_1, 0, count);

        //the below line doesn't gives response and code hangs here 
        count = clStream.Read(buffer_1, 0, buffer_1.Length);         
    }
}

还有其他方法可以将一个流写入另一个流吗?我想两次使用此Stream,这就是我需要将其写入MemoryStream的原因。

2 个答案:

答案 0 :(得分:5)

在.NET 4中,复制部分非常简单:

MemoryStream ms = new MemoryStream();
client.GetStream().CopyTo(ms);

如果您不使用.NET 4,那么类似于您已经获得的代码基本上是相同的。

但是,请注意,此(以及任何其他尝试)仅在网络流已关闭时才有效 - 否则Read调用将阻止等待更多数据。我怀疑你的问题是什么 - 这是一个根本问题。

如果你的网络流没有关闭,那么你不清楚你真的希望它如何表现 - 如果“拆分”流的两个读者基本上读取任何缓冲数据,但是然后阻塞直到有新数据呢?当然,当从两个流中读取缓冲数据时,可以删除缓冲数据。如果这就是你所追求的,我认为.NET中没有任何东西可以帮助你 - 而且它可能非常棘手。

如果你能给我们更多关于你想要做的事情(以及TcpClient连接到什么)的背景,那将会有所帮助。

答案 1 :(得分:1)

你的代码挂起clStream.Read的原因是因为你想要从套接字读取8192个字节,但另一方面没有人写这么多字节。所以客户端就坐在那里等待另一方发送所需的字节数。根据您尝试通过TCP实现的协议,服务器必须有一些消息,它打算发送多少数据,以便客户端事先知道并且只尝试读取那么多字节。

例如,在HTTP协议中,服务器在标头中发送Content-Length标头,以向客户端指示将在主体中发送多少数据。