为什么在C#networking中使用TCPListner时需要读写器流?

为什么在C#networking中使用TCPListner时需要读写器流?,c#,C#,为什么在C#networking中使用TCPListner时需要读写器流 例如: TcpClient client = server.AcceptTcpClient(); client.ReceiveTimeout = 75000; Stream s = client.GetStream(); StreamReader reader = new StreamReader(s); StreamWriter writer = new StreamWriter(s); writer.AutoFlush

为什么在C#networking中使用TCPListner时需要读写器流

例如:

TcpClient client = server.AcceptTcpClient();
client.ReceiveTimeout = 75000;
Stream s = client.GetStream();
StreamReader reader = new StreamReader(s);
StreamWriter writer = new StreamWriter(s);
writer.AutoFlush = true;

你不需要它们。如果不喜欢Tcp包装器类,可以使用原始套接字。请看一下
System.Net.Sockets。

TcpListener被设计为使用流有几个原因

首先,它使API与BCL中的其他中高级(与使用原始套接字相比)API保持一致。例如,处理文件IO的标准方法是使用流

其次,流为TCP通道的读写提供了巨大的优势。诚然,当你在处理非常简单的案件时,它们会使生活稍微困难一些,但只是稍微困难一些。然而,当您开始研究更复杂的场景时,它们会使一切变得更简单


例如,如果Tcp API不使用流,那么要通过连接压缩通信量(只需通过GZipStream或类似的方式将writer+reader传递给writer)会困难得多,或者要通过有线加密所有通信也会困难得多。流提供了大量的机会来轻松扩展您的算法以处理将来可能出现的情况。

如果您想处理文本而不是二进制数据,您只需要
StreamReader
/
StreamWriter

套接字自然地处理二进制数据,这就是
TcpClient
公开流的原因。流是一个二进制抽象,因此它的读/写方法处理字节数组
TextReader
/
TextWriter
(从中派生出
StreamReader
/
StreamWriter
)处理文本-它们的方法处理字符串和字符数组

StreamReader
/
StreamWriter
基本上是包装一个流,并为您在文本和二进制数据之间进行转换(通过
编码)