求C# Socket传输大量数据解决办法??

redskyzhong 2008-07-11 04:14:43
求C# Socket传输大量数据解决办法??尤其是在服务器端接收办法。我用的是在服务器端接收时按照接受的先后顺序重新组合,但用这种办法在接收时会出现问题,有时能正确接收,有时不能正常接收。
...全文
916 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhy011 2008-09-17
  • 打赏
  • 举报
回复
mark
路遥迢 2008-09-17
  • 打赏
  • 举报
回复
不知道你指的大量数据是什么意思?是传输的条数多,数据少,还是传输的条数少数据多?如果是前者,我一般用结构体,接受后要检查包是否完整,不完整继续接,当然还有心跳包等,就算是同步一天几百万条也应该没啥问题,如果你你说的顺序是指先进先出就是队列来管就行了
brallow 2008-09-16
  • 打赏
  • 举报
回复
HOHO,这种建议你分开发送会比较好。
具体的来说,
1:控制你每次send的时间间隔。
2:有必须的话可以采用异步响应的试,等收到对方的响应之后再传下一部分。

TCP的连接控制协议只能在一定范围内控制流量,一旦流量过大,超过其网络负载,时间一长,缓存空间不够的时候,你的数据就非丢不可了。
redskyzhong 2008-07-21
  • 打赏
  • 举报
回复
有TCP协议的socket程序没有??你上面这个是UDP的。我发送的时候也是采用的分包,传输的是对象序列化后的数据,在传输少量数据时是没有问题,但在传输超过50万条数据的时候就会出现错误。而且有时还会出现“主机中的软件已关闭一个远程连接”的错误提示。
我用的是NetworkStream类。
ansonxu2002 2008-07-17
  • 打赏
  • 举报
回复
分包处理,接收方收到包后,send一下,表示已经接收成功
发送方发完后Recevie等待,当收到上次接收成功消息后.继续发送
wangkuang5 2008-07-17
  • 打赏
  • 举报
回复

#region 磁盘空间管理:删除Player上指定的媒体文件

public void CommandSetManageDisk(byte gid, byte did,string deletestring)
{
// 分包发送
string ManageDiskStr = deletestring;
byte i = 0;
Encoding GB2312Encoding = UnicodeEncoding.GetEncoding("GB2312");
byte[] ManageDisk = GB2312Encoding.GetBytes(ManageDiskStr);
byte [] myManageDisk = new byte [300];
int txtLength = ManageDisk.Length;

int packetizationtimer = txtLength / 300;
int packetizationresidue = txtLength % 300;
int packetizationsender;
//如果没有余数,发包时就不用多发一次
if (packetizationresidue > 0)
{
packetizationsender = packetizationtimer + 1;
}
else
{
packetizationsender = packetizationtimer;
}
//开始分包发送
for (i = 0; i < packetizationsender; i++)
{
if (i < packetizationtimer)
{
Array.Copy(ManageDisk, i * 300, myManageDisk, 0, 300);
}
else
{
Array.Copy(ManageDisk, i * 300, myManageDisk, 0, packetizationresidue);
}

PlayerMessages.SetManageDisk setmanagedisk = new PlayerMessages.SetManageDisk();
setmanagedisk.direct = 0x02;
setmanagedisk.category = 0x03;
setmanagedisk.type = 0x10;

setmanagedisk.GroupID = gid ;
setmanagedisk.DeviceID = did ;
setmanagedisk.Sequence = i;
setmanagedisk.size = 300;
if (i == (packetizationsender-1)) {

setmanagedisk.Sequence=0xFF;
setmanagedisk.size =(ushort)packetizationresidue;

}

setmanagedisk.DeleteFile = myManageDisk;

byte[] data = PlayerMessages.StructToBytes(setmanagedisk);
ssock.OnUDPDataSend(data);
}
}



PlayerMessages.SetManageDisk 是struct,UDP包的数据结构
setmanagedisk.Sequence = i;表示包的序号,0xFF表示最后一个包

wangkuang5 2008-07-16
  • 打赏
  • 举报
回复
分包发送啊
wangkuang5@163.com
QQ:47332677
我发代码给你

111,096

社区成员

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

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

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