• 10702阅读
  • 38回复

多线程socket服务器及客户端解决方案 [复制链接]

上一主题 下一主题
离线feipeng1985
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2015-10-15
— 本帖被 XChinux 执行加亮操作(2016-04-05) —
demo主要用于服务端及客户端的多线程socket通讯管理问题,为每一个socket连接建立一个线程进行管理,使用此demo为蓝本可快速的构建出多线程socket通讯的服务端及客户端,数据传输中使用了一个简单的自定义报文头,用于解决tcp的粘包问题。服务端及客户端接收及发送数据由两部分构成,一部分为命令(cmdquint32型,一部分为需传输的数据data QByteArray型。客户端及服务端可以根据CMD的不同来约定对数据的不同解析方式。该demo经过Qt4.8.6Qt5.3.1windowsFedora、及嵌入式Armlinux多平台混合连接测试并持续24小时以上测试,无内存泄漏,稳定运行,可用于轻量级工程实例中作为网络数据传输的解决方案。
描述:demo
附件: Demo.rar (5760 K) 下载次数:883
21条评分好评度+4贡献值+3金钱+21威望+6
muzhi001 金钱 +3 非常优秀 10-12
电科院成成 金钱 +10 - 02-15
zadeh 好评度 +1 Good! 01-29
zadeh 贡献值 +1 Good! 01-29
zadeh 威望 +1 Good! 01-29
zadeh 金钱 +1 Good! 01-29
bs1003506507 威望 +1 - 01-04
zheng501gf 金钱 +1 - 2016-08-01
liuandsang 威望 +1 - 2016-05-22
liuandsang 金钱 +1 - 2016-05-22
离线feipeng1985

只看该作者 1楼 发表于: 2015-10-15
以前在多个平台发布过一些源码,但是伸手党太多,很多朋友下载了连回复都懒得回复,严重打击了我开源的精神,今日受论坛里一些大神的启发,决定先赞助再发源码,各位可以先下载下来看看,里面有一个简单的设计文档,本demo经过反复测试,连续几十小时在多个平台下大数据量的收发数据,可以稳定运行,可以作为工程版本直接使用,只需按照文档及源码demo中的例子从中继承出来即可。请赞助至支付宝289322970@qq.com 或微信feipeng289322970 20元,注意备注邮箱号,没收到源码的同学可发邮件催促,即可获得源码,多的不说,若您认为您挣20元的时间即可写出此代码请绕路,谢谢
有兄弟看了后跟我说,不知道这个demo是解决什么问题的,我再多讲几句吧,这个demo其实是把数据传输的通道给建立好了,使用这个demo为蓝本构建你的工程的话,可以不用关注于tcp的连接,数据的组装,线程间数据传递等工作,只需要从服务端及客户端的类继承出来,重写数据分发的类即可,所有线程进来的数据都会汇总至服务端和客户端,继承出得数据分发类虚函数中可以直接获取到接收到的数据,省掉了自己去做这个工作的时间。




1条评分金钱+1
wangwjie9107 金钱 +1 - 2016-08-31
离线feipeng1985

只看该作者 2楼 发表于: 2015-10-15
一楼有编译好的附件可以下载看看效果,服务端及客户端都支持多线程收发


离线hezf

只看该作者 3楼 发表于: 2015-10-16
支持楼主,赞助一点零花钱也挺好的,需要的时候就找你
none
离线learn0801

只看该作者 4楼 发表于: 2015-10-16
顺便提供个微信号呗,微信支付买一个。
支持原创,也支持收费,都是劳动成果
离线feipeng1985

只看该作者 5楼 发表于: 2015-10-16
回 learn0801 的帖子
learn0801:顺便提供个微信号呗,微信支付买一个。
支持原创,也支持收费,都是劳动成果 (2015-10-16 10:45) 

微信号 feipeng289322970 已更新至1楼
离线haiyongzz

只看该作者 6楼 发表于: 2015-10-16
支持收费,共同进步
离线不由天

只看该作者 7楼 发表于: 2015-10-16
学习下
离线stlcours

只看该作者 8楼 发表于: 2015-10-18
谢谢楼主的辛苦工作,我决定买了。唉,我就是属于书不好好看,成天买东西的那种~
离线songhuirong1

只看该作者 9楼 发表于: 2015-10-18
楼主。你的服务器模型有问题,来一个客户端就创建一个线程,这样系统开销太大。线程是一个非常耗资源的东西,如果同时有大量的客户端上来,你需要创建大量的线程,那么系统性能将会很差,甚至崩溃。
离线feipeng1985

只看该作者 10楼 发表于: 2015-10-18
回 songhuirong1 的帖子
songhuirong1:楼主。你的服务器模型有问题,来一个客户端就创建一个线程,这样系统开销太大。线程是一个非常耗资源的东西,如果同时有大量的客户端上来,你需要创建大量的线程,那么系统性能将会很差,甚至崩溃。 (2015-10-18 09:41)

这个模型没有问题,因为本身设计就是要并发的传输很多数据,你可以尝试一下,多个客户端并发每个客户端传送几十兆的东西给服务器,不用多线程,服务器是否能同时进行接收,而且,你说线程是一个非常耗资源的东西,我并不赞同,线程只在有数据传输的情况下处于工作状态,你可一个同时开多个客户端连上服务器,一起测试,看看效率是否有你说的会很差,甚至崩溃,请勿纸上谈兵,你可以就用我的例子,然后告诉我,你开到多少个客户端,同时传输数据,然后把系统搞崩溃了,就我知道的例子,我们公司现在的产品,在嵌入式arm上有几十个线程,并没有见过所谓的崩溃。
这位朋友,你可以试试服务端如果只有一个线程接收数据,能否达到我设计的这个demo的数据吞吐量即可,同时并发3个20M的数据传输给服务端,马上你就会看到服务端卡成鬼

离线songhuirong1

只看该作者 11楼 发表于: 2015-10-19
我在一台工控机上开了几十个线程,程序就崩溃了。你这个模型应该做不到高并发,比如同一时刻一千万个客户端同时连接上来,服务器应该扛不住吧。我也在找这方面的资料,但是发现qt是做不到高并发的。不知道楼主有解决方案不?望赐教!
离线songhuirong1

只看该作者 12楼 发表于: 2015-10-20
服务端一个线程处理客户端连接,具体工作放到线程池里处理
离线albanjiang

只看该作者 13楼 发表于: 2015-11-03
支持楼主
离线li_jian_xing

只看该作者 14楼 发表于: 2015-11-04
这服务模型是再过时不过的东西了,抗不成大并发,你说的这点数据吞吐量的问题更是小儿科了
离线ccccwwh

只看该作者 15楼 发表于: 2016-01-22
支持原创收费,
离线hehui

只看该作者 16楼 发表于: 2016-01-26
为每一个socket连接建立一个线程进行管理,连接一多你的程序就完蛋了
在线liudianwu

只看该作者 17楼 发表于: 2016-01-26
回 hehui 的帖子
hehui:为每一个socket连接建立一个线程进行管理,连接一多你的程序就完蛋了 (2016-01-26 12:47) 

好像是的,线程管理需要开销的,尤其是ARM上,跑不了多久就会程序死掉!
离线jienze

只看该作者 18楼 发表于: 2016-01-26
楼主应该注意定义程序的边界条件,
就是说每个程序的运行都是有限制的,
我做的多线程TCP程序就定义了客户端连接
的个数。
如果超出这个数目就FIFO了,这样保证程序的正常运行。
欢迎交流合作~!!
离线snowseya

只看该作者 19楼 发表于: 2016-01-29
为每个连接开一个线程确实有一点小问题的,尤其到了一定数量级的时候。可以参考一下boost asio的实现。实际上是一个模式选择的问题。使用前摄模式,一个线程处理几千个连接是没问题的(前提是没有往硬盘里写,如果往硬盘里写,那么还需要处理硬盘写的问题,否则几十个连接就可以让机器硬盘狂转了,当然如果是SSD另算)
离线snowseya

只看该作者 20楼 发表于: 2016-01-29
还是支持楼主的这种精神
离线crazy

只看该作者 21楼 发表于: 2016-04-05
计算机专业。
热衷于Windows、ARM、linux下的Qt应用程序开发、C驱动程序开发以及网络编程,
喜欢C/C++,Qt.搞过C#、java、Stm32,ZigBee,画过PCB,焊过电路板.
邮箱:kevinlq0912@163.com
企鹅:2313828706
博客:http://kevinlq.com/
公众号:devstone
离线sunnlboy

只看该作者 22楼 发表于: 2016-04-07
非常好的demo,感谢楼主!
离线姜小白

只看该作者 23楼 发表于: 2016-04-19
卖了多少份?
Qt技术交流:QQ2499971906
离线t1029901995

只看该作者 24楼 发表于: 2016-04-22
            
离线mycpp2015082

只看该作者 25楼 发表于: 2016-05-06
离线kettong

只看该作者 26楼 发表于: 2016-06-07
  
离线czy455475537

只看该作者 27楼 发表于: 2016-07-30
这个支持udp/tcp打洞吗,多线程可能确实不适合大并发,windows下应该使用完成端口,linux应该使用epoll
离线fastestsnail

只看该作者 28楼 发表于: 2016-08-08
离线hunterzf

只看该作者 29楼 发表于: 2016-09-23
谢谢,学习一下,我看看
离线kccyp

只看该作者 30楼 发表于: 2016-12-28
非常感谢
离线songhuirong1

只看该作者 31楼 发表于: 2016-12-28
楼主请教个问题
“为每一个socket连接建立一个线程进行管理”,如果有1000个连接,那就要开1000个线程,这样服务器的性能是否有问题。CPU不停的在不同的线程间切换,大大降低了服务器的性能。Qt目前只支持大概1000个连接,如果有更多的连接的话,那服务器的性能又会怎么样?我认为这种方式不是很合理,楼主认为呢?这是我的个人观点,不知楼主怎么看。
离线feipeng1985

只看该作者 32楼 发表于: 04-19
回 songhuirong1 的帖子
songhuirong1:楼主请教个问题
“为每一个socket连接建立一个线程进行管理”,如果有1000个连接,那就要开1000个线程,这样服务器的性能是否有问题。CPU不停的在不同的线程间切换,大大降低了服务器的性能。Qt目前只支持大概1000个连接,如果有更多的连接的话,那服务器的性能又会怎么样?我认为 .. (2016-12-28 12:37) 

好久没来这里看看了,首先,回答你的问题,这个项目定位的是轻量级应用,你说的这个已经不是轻量级应用的范畴了,我这个解决的是1~8个客户端左右的实例,对于每种不同的需求当然是需要区别对待的,比如,你不能拿个服务器上的代码去嵌入式上面用吧,资源,性能都差太远,我这个设计的思路就是为嵌入式设备,少量客户端同时连接时设计的,并不是做大并发使用的~
离线songhuirong1

只看该作者 33楼 发表于: 04-20
回 feipeng1985 的帖子
feipeng1985:好久没来这里看看了,首先,回答你的问题,这个项目定位的是轻量级应用,你说的这个已经不是轻量级应用的范畴了,我这个解决的是1~8个客户端左右的实例,对于每种不同的需求当然是需要区别对待的,比如,你不能拿个服务器上的代码去嵌入式上面用吧,资源,性能都差太远,我这个设 .. (2017-04-19 17:30) 

几个客户端的话,那是没有问题的
离线bast

只看该作者 34楼 发表于: 09-26
    
离线muzhi001

只看该作者 35楼 发表于: 10-12
真心感谢
离线terrencens

只看该作者 36楼 发表于: 10-24
谢谢分享,对于一个刚上手的新手会有莫大的帮助!感谢
离线xin5683

只看该作者 37楼 发表于: 10-25
感谢分享,学习一下。
离线victoire

只看该作者 38楼 发表于: 11-17
谢谢,学习一下,我看看
快速回复
限100 字节
 
上一个 下一个