首页 新闻 搜索 专区 学院

C#TCP发送大数据的问题

0
悬赏园豆:40 [已解决问题] 解决于 2013-07-31 21:20

C#采用TcpListener与客户端连接,从server一次性发送1000个职员资料到某登录连接上的client,因为数据量大,client接受不到,应如何处理?最好有代码提示。

TCP
问题补充:

是开发局域网中的即时通讯软件,有1000多个用户。客户端上线要下载的联系人资料也有1000多个。TcpListener/tcpClient

龍在江湖的主页 龍在江湖 | 初学一级 | 园豆:13
提问于:2013-07-23 16:54
< >
分享
最佳答案
0

1000个职员的资料在多大?如果数据量大的, 不建议找包传输, 可以分散后再传。 

例如同时有100个client在线,分别发了一批,再发一批。 就像股市看盘那样,数据分时间段来发。如果分段都太大了, 不建议用tcp

收获园豆:30
风浪 | 老鸟四级 |园豆:2866 | 2013-07-23 17:38

哇,我目前自己正是采用的这方法,我还以为这方法不够科学呢?或许原则是能解决问题就行。

但这里面的确也要能有不科学的成份,假如一批数据有100条记录,分5批发,每批20条,但可能每个20条记录的大小又不同,有的有图片。

龍在江湖 | 园豆:13 (初学一级) | 2013-07-23 18:08

@龍在江湖: 既然这么多文件类的信息, 为什么要用tcp传送给他们呢, 如果他们那也是软件的, 可以用FTP的方式, 他们需要用到数据时, 从FTP下载最新的。 软件上只标志当前电脑上的版本号, 取个版本号与服务器上最上的版本号比较就可以, 就像杀毒软件, 需要用到时再升级。 用tcp发大数据包的,需要很好的算法

风浪 | 园豆:2866 (老鸟四级) | 2013-07-23 18:20

@风浪: 不好意思,是我表述不清。我是开发内部的即时通讯管理软件(如QQ一样的),就是在客户端登录载入联系人时,由服务器把几百个联系人资料显示给用户,这些资料还包括联系人的照片,发送不是采用数据库连接,也不是UDP(因为UDP丢包)发送,而是采用的TCPListener/TcpClient来发送与接收的。现在我是分段发送的,还采用Thread.Sleep(200)才要以,但速度很慢要差不多2分钟,所以觉得方法可能不当,向有经验者请教。谢谢。

龍在江湖 | 园豆:13 (初学一级) | 2013-07-25 18:50

@龍在江湖:  我大约知道是什么样的项目, 但感觉你这样的设计对多客户端来说, 不一定合理. 一次性分发数据, 只能合适于几个或十几个客户端同时在线, 如果有百来个客户端, 你分发一次要2分钟, 同时登陆10人时, 需要20分钟. 一定存在丢包的现象,就算不丢包, 这速度也不是现代计算机系统所接受的. 既然知道是QQ类的软件的, 就要知道本地数据. 像QQ, 你登陆时, 是从你的电脑上读取数据. 并不是从服务器读取, 当登陆后, 再用线程来更新用户的数据. 这个很重要, 你是的服务器主动分发, 他们的是被动分发. 而且服务器分发时, 只分发最基本的资料, 就像一个数据列表, 你只显示一些客户的基本资料, 详细资料需要点详细信息时, 把客户ID向服务器发送, 服务器是被动请求的, 当接到请求时, 把当前的客户ID的资料返回.

风浪 | 园豆:2866 (老鸟四级) | 2013-07-26 16:50

@风浪: 非常谢谢您的解答。Server发资料给client不是一个接着一个串行发的,而是可以同时响应多个用户,可以同时向多个client发资料,所以上面并非10个用户就要20分钟时间。您后面的解答意思概括是“在必要的时候做必要的事”,这个思想是很好的。

龍在江湖 | 园豆:13 (初学一级) | 2013-07-27 18:48
其他回答(1)
0

这个问题我也遇到了。不过我的方法是自己建立了一个基于TCP的协议。

大概原理是这样:

1、建立连接

2、客户端发送一个头字符串,包括要发送数据的字节长度,附加信息等,附加信息最好控制1024以内。

3、服务器接收到以后返回一个确认字符。

4、客户端接收到确认字符后,开始拆分数据,我是按照1024一个包,把所有的数据全部序列化成byte来发送。

5、服务器开始循环接收数据,用的异步接收,然后判断当接收到的数据长度等于头字符串中约定的长度后,停止接收,并进行相应的运算处理,然后返回所需要的数据(没有就发个"null")。

6、客户端接收到返回数据后,直接发送完成字符,然后断开连接。

JulyWang | 园豆:202 (菜鸟二级) | 2015-04-20 14:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册