1.遇到问题
首先说明一下我遇到的问题:服务端传递Byte数组,长度在900w,客户端接收时会耗时10s。
我的代码是这样的。
2.Socket缓冲区
http://t.zoukankan.com/bigberg-p-7747419.html
每个socket被创建后,都会分配两个缓冲区:输入缓冲区和输出缓冲区。
write()和send()并不立即向网络中传输数据,而是先将数据写入缓冲区后,再由TCP协议将数据从缓冲区发送到目标机器。
因为缓冲区的存在,我们在传输大量数据时不能一下子全部传输完毕,这与接收和发送的数据量没有关系,即send(1024)和receive(1024)设置多少没有关系。
3.如何接收数据
1.分段获取数据
ArrayList dataArr = new ArrayList();
bool haveData = false;
while (true)
{
Console.WriteLine(socket.Available);
if (socket.Available > 0)
{
byte[] data_temp = new byte[socket.Available];
socket.Receive(data_temp);
dataArr.AddRange(data_temp);
haveData = true;
}
else { if (haveData) { finished = true; break; } }
Thread.Sleep(50);
}
这种情况遇到数据量较大时,会比较耗时。
2.使用ReceiveFrom接收数据报并存储源终结点
https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.receivefrom?view=net-6.0