2011-09-23 113 views
3
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如何将流写入内存流?

回答

5

在.NET 4中复制的部分是很容易的:

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

如果你不使用.NET 4,那么类似的代码,你已经得到了基本相同的事情。

然而,请注意,如果网络流已经关闭,这(和任何其他的企图)只会工作 - 否则Read调用将阻塞等待更多的数据。我怀疑这是你的问题 - 这是一个基本问题。

如果您的网络流没有关闭,那么目前还不清楚您希望它的行为方式 - “split”流的两个阅读器是否应该基本读取任何缓冲数据,但是会阻塞,直到出现新数据?当然,从两个流中读取缓冲的数据都可以被删除。如果这就是你所追求的,我认为.NET中没有任何东西可以帮助你 - 特别是它可能非常棘手。

如果你可以给我们更多关于你正在尝试做什么(以及TcpClient连接到什么)的上下文,那真的会有所帮助。

+0

@purvang:啊,所以你是服务器,而不是客户...客户端要做什么?如果它没有关闭连接,你可以永远阅读... –

+0

TcpClient client = tcplistener.AcceptTcpClient(); //它接受客户端请求 – purvang

+0

客户端只是在浏览器中提供请求,我只是扫描请求是否正确,然后将其发送到原始服务器。所以我使用这个流来扫描请求,所以我需要使用两个流,一个用于显示,另一个用于扫描。我读了两次使用这个流,我应该把它写入内存流。请指导我!感谢你的回答!! – purvang

1

您的代码挂在clStream.Read上的原因是因为您正在从套接字读取8192个字节,但在另一侧没有人正在写入那么多字节。所以客户端只是坐在那里等待对方发送所需的字节数。根据您试图通过TCP实现的协议,服务器必须发出多少数据才能发送,以便客户端事先知道并只尝试读取那么多字节。

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