从网络流中读取数据.我应该使用什么字节大小

本文关键字:什么 字节 我应该 网络 读取 数据 | 更新日期: 2023-09-27 18:13:00

我试图找出我应该设置我的byteSize到从NetworkStream读取时的大小。使用更小或更大的数字有什么利弊?

我见过很多使用256的例子。为什么?

int byteSize = 256;
TcpListener server = new TcpListener(IPAddress.Any, 9999);
server.Start();
Byte[] bytes = new Byte[byteSize];
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
int i = 0;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
    // Do stuff with the stream
}

从网络流中读取数据.我应该使用什么字节大小

让它太小,你会因为。net不得不更频繁地调用操作系统来重新填充缓冲区而失去一些效率。如果它太大,就会浪费一些内存。

它不是那么关键,但256是低端。一个非常常见的I/O缓冲区大小是4096字节。在Windows中,内存页面的大小是一个神奇的数字。尽管缓冲区只是偶然地跨在一个页面上。

无论您根据代码设置它,i是从套接字读取的实际字节数,因此如果ibyteSize小得多,byteSize对您没有帮助。

在你的while中,你应该检查i是否比byteSize小,如果是这样,复制byte(字节数组)的第一个i字节到一个安全的地方,即内存流或文件流,并继续读取套接字以到达网络流的末端(其中i = 0)。1024,2048和4096似乎很好,这取决于你的网络速度,可用内存和使用这样一个缓冲区的线程。例如,使用100个线程和1024个缓冲区大小需要100 KB的RAM,这在今天的硬件规模下根本不算什么。

就我个人而言,大多数时候使用智能缓冲区,我的意思是在运行时我根据缓冲区大小检查读取量并纠正它以获得更好的结果(尽管如果根据项目值得)。

我现在偶然发现了这个,以防其他人也这样做这就是我将如何设置字节大小https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient.getstream?view=netframework-4.7.2

int byteSize = new byte[tcpClient.ReceiveBufferSize];
Byte[] bytes = new Byte[byteSize];