我有以下代码:
_clientRequestStream = _tcpClient.GetStream();
var memoryStream = new MemoryStream();
_clientRequestStream.CopyTo(memoryStream);
CopyTo
需要很长时间很长时间才能将一个复制Stream
到另一个Stream
。似乎应用程序无缘无故地停在那里,或者至少我找不到原因。
我有以下代码:
_clientRequestStream = _tcpClient.GetStream();
var memoryStream = new MemoryStream();
_clientRequestStream.CopyTo(memoryStream);
CopyTo
需要很长时间很长时间才能将一个复制Stream
到另一个Stream
。似乎应用程序无缘无故地停在那里,或者至少我找不到原因。
网络流保持打开状态,直到它被流的一端关闭。CopyTo() 复制流中的所有数据,等待流结束。如果服务器没有发送数据,则流不会结束或关闭,CopyTo() 会尽职尽责地等待更多数据或流结束。流另一端的服务器必须关闭流才能结束并返回 CopyTo()。
谷歌“TcpClient 教程”或“TcpCLient 示例”以获得一些不错的页面,展示您可能使用它们的其他方式,例如检查 NetworkStream.DataAvailable 以查看是否有数据等待或流是否仍然打开而没有数据。要仅读取一些数据而不等待流关闭,您可以使用 NetworkStream.Read() 或将其包装在 StreamReader 中并使用 ReadLine()。这完全取决于您要连接的服务器以及您要完成的工作。
TCP 是一种流协议。字节可以以任意速率流动。理论上你可以得到一个字节,然后几秒钟后得到 10 个字节,几分钟后得到两个字节。
TCP 本身作为一种协议是没有用的。
必须有一个高阶协议,其结构允许检测“消息”的开头和结尾。我们无法猜测您正在收听的高阶协议,您必须知道才能收听。
我相信这将无限期地阻塞,直到底层连接关闭,在这种情况下,我假设它会抛出一个 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