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
的原因。
答案 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标头,以向客户端指示将在主体中发送多少数据。