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

redskyzhong 2008-07-11 04:14:43
求C# Socket传输大量数据解决办法??尤其是在服务器端接收办法。我用的是在服务器端接收时按照接受的先后顺序重新组合,但用这种办法在接收时会出现问题,有时能正确接收,有时不能正常接收。
...全文
899 7 打赏 收藏 转发到动态 举报
写回复
用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
我发代码给你
通用数据传输socket构架源码 源码描述: 一、源码特点 1、此软件的基本思想是为了建立一套简单稳点可多负载的架构,通用数据通讯构建,设计基于TCP通信的交互框架。目前以达到3.0版本,可规范先后台交互处理,可支持,B/C(websocket),C/S,手机移动标准化的通信方式。达到后台业务一次编写,前台展示全线支持的目的。还可根据网络及负载情况分布式部署网管与服务。 二、菜单功能 网关负载原理说明 1、对于网络连接来说,一般的连接极限来自于,应用程序性能,网络带宽,和机器连接极限. 2、此网关负载主要是通过,多机运行节点,,多节点数据合并,避免机器连接极限,与带宽极限。此网关适合于数据类型项目,对于大型文件下载传输,视频并不合适。 3、主要有点使用TCP方式,支持多种类型客户端连接,WP系统客户端,C/S客户端,安卓客户端,IOS客户端,B/S客户端,PLC,各种支持TCP微芯片设备。适用于,网络游戏,工业信息采集,智能家庭设备采集,工业设备采集,实时性较强的IM类型项目,也可替代一般的程序与数据库交互,可做到数据传输快,安全,稳定。极大的降低数据库压力。 4、原理说明:在客户端大量并发的情况下,一个应用所承受是有极限的,分布这个极限需要使用多机负载,在多机负载情况下,为了保证数据一致性,会有越来越多的资源消耗在数据同步中,此方案解决的是在数据带宽占用小,连接数量大的项目中,通过使多机负载的数据合并数据通道,使多个客户端连接,合并入同一通道内,减少对于数据功能端的连接数量消耗.改为对带宽资源消耗,以空间换连接资源的方法节约,并提高负载能力.相当于客户端如果发送请为10W个,网关转化量设置为100,则数据处理端的连接量为10W/100=1000个 三、注意事项 1、开发环境为Visual Studio 2013,使用.net 4.0开发。
非常不错,c#入门经典哦! 关于socket的,适合初学者。 #socket编程基础 Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要 --从socket套接字到普通的请/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断扩展的需要。 抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net类可以视为包含3个层次:请/响应层、应用协议层、传输层。 WebReqeust和WebResponse 代表了请/响应层,支持Http、Tcp和Udp的类组成了应用协议层,而Socket类处于传输层。 传输层位于这个结构的最底层,当其上面的应用协议层和请/响应层不能满足应用程序的特殊需要时,就需要使用这一层进行Socket套接字编程。 而在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。System.Net 命名空间中的所有其他网络访问类都建立在该套接字 Socket实现之上,如TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP 连接的详细信息;NetworkStream类则提供用于网络访问的基础数据流等,常见的许多 Internet服务都可以见到Socket的踪影,如Telnet、Http、Email、Echo等,这些服务尽管通讯协议Protocol的定义不同,但是其基础的传输都是采用的Socket。 其实,Socket可以象流Stream一样被视为一个数据通道,这个通道架设在应用程序端(客户端)和远程服务器端之间,而后,数据的读取(接收)和写入(发送)均针对这个通道来进行。 可见,在应用程序端或者服务器端创建了Socket对象之后,就可以使用Send/SentTo方法将数据发送到连接的Socket,或者使用Receive/ReceiveFrom方法接收来自连接Socket数据; 针对Socket编程,.NET 框架的 Socket 类是 Winsock32 API 提供的套接字服务的托管代码版本。其中为实现网络编程提供了大量的方法,大多数情况下,Socket 类方法只是将数据封送到它们的本机 Win32 副本中并处理任何必要的安全检查。如果你熟悉 Winsock API函数,那么用Socket类编写网络程序会非常容易,当然,如果你不曾接触过,也不会太困难,跟随下面的解说,你会发觉使用 Socket类开发windows 网络应用程序原来有规可寻,它们在大多数情况下遵循大致相同的步骤。

110,534

社区成员

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

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

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