3

我有以下代码:

_clientRequestStream = _tcpClient.GetStream();

var memoryStream = new MemoryStream();
_clientRequestStream.CopyTo(memoryStream);

CopyTo需要很长时间很长时间才能将一个复制Stream到另一个Stream。似乎应用程序无缘无故地停在那里,或者至少我找不到原因。

4

3 回答 3

13

网络流保持打开状态,直到它被流的一端关闭。CopyTo() 复制流中的所有数据,等待流结束。如果服务器没有发送数据,则流不会结束或关闭,CopyTo() 会尽职尽责地等待更多数据或流结束。流另一端的服务器必须关闭流才能结束并返回 CopyTo()。

谷歌“TcpClient 教程”或“TcpCLient 示例”以获得一些不错的页面,展示您可能使用它们的其他方式,例如检查 NetworkStream.DataAvailable 以查看是否有数据等待或流是否仍然打开而没有数据。要仅读取一些数据而不等待流关闭,您可以使用 NetworkStream.Read() 或将其包装在 StreamReader 中并使用 ReadLine()。这完全取决于您要连接的服务器以及您要完成的工作。

于 2012-07-31T21:49:57.470 回答
6

TCP 是一种流协议。字节可以以任意速率流动。理论上你可以得到一个字节,然后几秒钟后得到 10 个字节,几分钟后得到两个字节。

TCP 本身作为一种协议是没有用的。

必须有一个高阶协议,其结构允许检测“消息”的开头和结尾。我们无法猜测您正在收听的高阶协议,您必须知道才能收听。

于 2012-07-31T22:09:34.793 回答
2

我相信这将无限期地阻塞,直到底层连接关闭,在这种情况下,我假设它会抛出一个 IOException。小心将 NetworkStream 视为普通流。TCPClient.GetStream() 是一个很好的抽象,它为您节省了直接使用 Socket 的麻烦,但是使用 NetworkStream 的同步操作很容易陷入这样的陷阱。值得查看 NetworkStream 上的特定 MSDN 文档。

Here's a nice example of using async sockets as opposed to TCP client: http://www.codeproject.com/Articles/83102/C-SocketAsyncEventArgs-High-Performance-Socket-Cod

于 2012-07-31T22:11:44.063 回答