40M的文件 客户端和服务端都在本机运行发了7分钟

threadroc 2018-06-18 03:13:11
我写了个传文件的功能,客户端和服务端在一台机器,客户端连服务器用的127.0.0.1
结果本机测试40M的文件发了7分钟...
为何会如此之慢,是因为我每次只发送1024字节,太少的原因吗?

public void sendBytes(Socket socket, byte[] bytes)
{
if (socket.Connected)
{
int lenPer = 1024;

#region 发送bytes;
int count = 0;
byte[] bytesSend = new byte[lenPer + 4];//通过socket发送的数据;
byte[] bytesLen = null;//每个包的长度;(前4个字节表示)
while (true)
{
if (count == bytes.Length)
{
socket.Send(BitConverter.GetBytes(0));//
break;//跳出循环,结束发送;
}
if ((bytes.Length - count) >= lenPer)//如果剩余字节数>=1024字节,则发送1024字节;
{
bytesLen = BitConverter.GetBytes(lenPer);//要发送的字节长度是1024
bytesLen.CopyTo(bytesSend, 0);//将长度bytes复制到要发送数组的前4个字节;
Array.Copy(bytes, count, bytesSend, 4, lenPer);
socket.Send(bytesSend);
count += lenPer;
}
else//要发送的bytes的总长度-已经发送的长度count->小于1024
{
bytesSend = new byte[(bytes.Length - count) + 4];
bytesLen = BitConverter.GetBytes(bytes.Length - count);
bytesLen.CopyTo(bytesSend, 0);
Array.Copy(bytes, count, bytesSend, 4, bytes.Length - count);
socket.Send(bytesSend);
count = bytes.Length;
}
}
#endregion
}
else
{
throw new Exception("远程服务器断开连接");
}
}

public byte[] receBytes(Socket socket)//接收bytes并反序列化为对象;
{
if (socket.Connected)
{
byte[] bytes = null;
int timeCount = 0;
while (true)
{
byte[] bytesPackLen = new byte[4];//存储包长的数组;(前4个字节表示)
int packLen = 0;//包长;
int receLen = socket.Receive(bytesPackLen, 0, 4, SocketFlags.None);//从buffer中的前4个字节读出包长;
packLen = BitConverter.ToInt32(bytesPackLen, 0);//确定每次要接受多少字节数
if (packLen > 0)//如果要接收的包长>0,说明数组没发送完毕;
{
//接收指定包长的字符串数组;
byte[] bytesReceive = new byte[packLen];
int receLenCount = 0;//接收到的字节长度统计;
while (true)
{
byte[] bytesTmp = new byte[packLen - receLenCount];
receLen = socket.Receive(bytesTmp, 0, packLen - receLenCount, SocketFlags.None);//接收服务器指定字节的数据;
Buffer.BlockCopy(bytesTmp, 0, bytesReceive, receLenCount, receLen);//把实际接收到的bytes复制到bytesReceive里;
receLenCount += receLen;
if (receLenCount == packLen)
{
break;
}
}
if (bytes == null)//null,说明第一次接数据包;
{
bytes = new byte[bytesReceive.Length];
bytesReceive.CopyTo(bytes, 0);
}
else//说明已经接到过一次数据包,需要合并;
{
bytes = bytesClass.mergeBytes(bytes, bytesReceive);//把刚接收到的数据包追加到bytes里;
}
}
else
{
break;
}
}
return bytes;
}
else
{
throw new Exception("远程服务器断开连接");
}
}
...全文
472 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
InDepth 2018-06-20
  • 打赏
  • 举报
回复
说了好多,但都没涉及到根本,应该根据SOCKET的缓冲大小进行发送,发送可能返回值不等于发送值,这时需要把没发送完的继续发送
  • 打赏
  • 举报
回复
引用 1 楼 threadroc 的回复:
好像就是一次发送字节太少的原因,我改成一次发送6万个字节就3秒发送并接收完毕. 请问这个数字设置多少比较合适.
以测试为准,不是猜的。 你可以以400k字节测试,而不是1、2k字节。
  • 打赏
  • 举报
回复
引用 1 楼 threadroc 的回复:
好像就是一次发送字节太少的原因,我改成一次发送6万个字节就3秒发送并接收完毕. 请问这个数字设置多少比较合适.
iis从上世纪90年代末默认设置是2M之后就没有改变过。 迅雷默认现在已经是64M了。 这些东西需要的是一个具体的工作环境,网络环境,服务器压力等等的统筹后计算的,一般来说,你按照压力测试正常结果越高越好。
  • 打赏
  • 举报
回复
将这种不确定的东西写在配置文件里,在实际环境中可以通过尝试反复的修改配置来确定哪个数字更优
exception92 2018-06-19
  • 打赏
  • 举报
回复
threadroc 2018-06-18
  • 打赏
  • 举报
回复
好像就是一次发送字节太少的原因,我改成一次发送6万个字节就3秒发送并接收完毕. 请问这个数字设置多少比较合适.

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧