查看完整版本: [-- 多线程socket服务器及客户端解决方案 --]

QTCN开发网 -> Qt 作品展 -> 多线程socket服务器及客户端解决方案 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

feipeng1985 2015-10-15 19:04

多线程socket服务器及客户端解决方案

demo主要用于服务端及客户端的多线程socket通讯管理问题,为每一个socket连接建立一个线程进行管理,使用此demo为蓝本可快速的构建出多线程socket通讯的服务端及客户端,数据传输中使用了一个简单的自定义报文头,用于解决tcp的粘包问题。服务端及客户端接收及发送数据由两部分构成,一部分为命令(cmdquint32型,一部分为需传输的数据data QByteArray型。客户端及服务端可以根据CMD的不同来约定对数据的不同解析方式。该demo经过Qt4.8.6Qt5.3.1windowsFedora、及嵌入式Armlinux多平台混合连接测试并持续24小时以上测试,无内存泄漏,稳定运行,可用于轻量级工程实例中作为网络数据传输的解决方案。

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





feipeng1985 2015-10-15 19:23
一楼有编译好的附件可以下载看看效果,服务端及客户端都支持多线程收发
[attachment=14402]


hezf 2015-10-16 08:28
支持楼主,赞助一点零花钱也挺好的,需要的时候就找你

learn0801 2015-10-16 10:45
顺便提供个微信号呗,微信支付买一个。
支持原创,也支持收费,都是劳动成果

feipeng1985 2015-10-16 12:21
learn0801:顺便提供个微信号呗,微信支付买一个。
支持原创,也支持收费,都是劳动成果 (2015-10-16 10:45) 

微信号 feipeng289322970 已更新至1楼

haiyongzz 2015-10-16 14:31
支持收费,共同进步

不由天 2015-10-16 16:52
学习下

stlcours 2015-10-18 03:12
谢谢楼主的辛苦工作,我决定买了。唉,我就是属于书不好好看,成天买东西的那种~

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

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

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


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

songhuirong1 2015-10-20 07:17
服务端一个线程处理客户端连接,具体工作放到线程池里处理

albanjiang 2015-11-03 20:34
支持楼主

li_jian_xing 2015-11-04 11:20
这服务模型是再过时不过的东西了,抗不成大并发,你说的这点数据吞吐量的问题更是小儿科了

ccccwwh 2016-01-22 15:43
支持原创收费,

hehui 2016-01-26 12:47
为每一个socket连接建立一个线程进行管理,连接一多你的程序就完蛋了

liudianwu 2016-01-26 12:56
hehui:为每一个socket连接建立一个线程进行管理,连接一多你的程序就完蛋了 (2016-01-26 12:47) 

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

jienze 2016-01-26 14:36
楼主应该注意定义程序的边界条件,
就是说每个程序的运行都是有限制的,
我做的多线程TCP程序就定义了客户端连接
的个数。
如果超出这个数目就FIFO了,这样保证程序的正常运行。

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

snowseya 2016-01-29 15:23
还是支持楼主的这种精神

crazy 2016-04-05 22:50

sunnlboy 2016-04-07 21:19
非常好的demo,感谢楼主!

姜小白 2016-04-19 17:14
卖了多少份?

t1029901995 2016-04-22 09:48
            

mycpp2015082 2016-05-06 05:02

kettong 2016-06-07 17:19
  

czy455475537 2016-07-30 21:15
这个支持udp/tcp打洞吗,多线程可能确实不适合大并发,windows下应该使用完成端口,linux应该使用epoll

fastestsnail 2016-08-08 17:22

hunterzf 2016-09-23 16:07
谢谢,学习一下,我看看

kccyp 2016-12-28 11:07
非常感谢

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

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

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

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

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

bast 2017-09-26 17:05
    

muzhi001 2017-10-12 16:57
真心感谢

terrencens 2017-10-24 13:11
谢谢分享,对于一个刚上手的新手会有莫大的帮助!感谢

xin5683 2017-10-25 15:13
感谢分享,学习一下。

victoire 2017-11-17 12:09
谢谢,学习一下,我看看

gloomy丶kook 2017-11-29 11:00
围观一下,正好需要学习

风中游荡的余 2017-12-09 09:33
支持楼主,好东西

jooco1223 2018-03-16 11:38
您好 希望可以学习下这个代码,请问怎么与您联系。

luanl 2018-04-14 23:00
非常感谢楼主的demo。

greatwo 2019-09-02 10:26
好东西支持一下

wtutuybbh 2020-04-25 09:23
非常具有学习意义,谢谢楼主


查看完整版本: [-- 多线程socket服务器及客户端解决方案 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled