• 6387阅读
  • 14回复

[讨论]多线程服务器问题 [复制链接]

上一主题 下一主题
离线sambrown
 
只看楼主 倒序阅读 楼主  发表于: 2013-05-01
想写一个简单的多线程服务器
于是就参考了qt example 里面的QThreadFortuneServer
这个例子在实现多线程服务器时,在监听函数里面开了一个线程 就是thread 对象。
void FortuneServer::incomingConnection(int socketDescriptor){    QString fortune = fortunes.at(qrand() % fortunes.size());    FortuneThread *thread = new FortuneThread(socketDescriptor, fortune, this);    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));    thread->start();}
请问如果要是多个客户端同时连接是,是不是应该改成  thread数组?
FortuneThread *thread
每当有一个客户端连接的话就新建立一个对象?thread[i++]
离线pxiao_xiao

只看该作者 1楼 发表于: 2013-05-01
无能为力 想了想 不用每个连接客户端的SOCKET都建立一个线程 也不是没有办法  你得自己构造数据结构和通知机制
离线sambrown
只看该作者 2楼 发表于: 2013-05-01
回 1楼(pxiao_xiao) 的帖子
为每个客户端建立socket怎么写? 每个客户端都是一个 QThread 类 的对象吗?
离线pxiao_xiao

只看该作者 3楼 发表于: 2013-05-01
这个没法讲 你要构建类似WINDOWS的WaitForMultipleObjects这样的机制
离线sambrown
只看该作者 4楼 发表于: 2013-05-01
回 3楼(pxiao_xiao) 的帖子
我只是想让多个客户端发送数据, 让一个服务端接受, 有这么麻烦吗? 难道还要写个线程池什么的?
离线ppdayz

只看该作者 5楼 发表于: 2013-05-02
接收是没有问题,不用什么线程池,但是关键是你要接收了处理,如果单纯接收而不处理的话,单线程就没问题,但是光接收不处理又有什么用呢?
离线sambrown
只看该作者 6楼 发表于: 2013-05-02
回 5楼(ppdayz) 的帖子
请教一下什么叫处理?我程序主要是将多个客户端的数据传送到服务器,服务器把数据存储一下就行了。
离线圣域天子

只看该作者 7楼 发表于: 2013-05-05
Re:回 5楼(ppdayz) 的帖子
引用第6楼sambrown于2013-05-02 09:50发表的 回 5楼(ppdayz) 的帖子 :
请教一下什么叫处理?我程序主要是将多个客户端的数据传送到服务器,服务器把数据存储一下就行了。

Windows下应该是使用IOCP技术,不过好象Qt没有实现,需要自己写了?
离线liyingju001

只看该作者 8楼 发表于: 2013-09-07
你弄出来没?
离线bingyifeng

只看该作者 9楼 发表于: 2013-09-07
回 6楼(sambrown) 的帖子
这个得看具体需求吧。
你要是数据量不大而且频度不高的话,一个线程就可以了。
但是如果你的频度很高的话,存储很耗时间的,会来不及响应客户端请求的。
<span style="color:blue ">淘宝,绿石斋</span> <a href="http://shop33295817.taobao.com“> <span style="color:blue ">各种水晶饰品,手链,项链 </span></a>
离线ppdayz

只看该作者 10楼 发表于: 2013-09-12
回 楼主(sambrown) 的帖子
最近我也写了一个多线程的服务器,用的蓝本就是FortuneServer
我的服务器是结合syslog-ng用的,简单的说就是syslog-ng收到的log会转发到我的server上,然后有专门的client来连接我的server,因为平时的log量比较大,基本上是每小时10w条,所以是每个client都是让server开一个线程去连接,server只需要管理好这些线程就可以。
Qt封装的已经很好了,FortuneServer这种结构是很好的一个结构,server起到的是“拉皮条”和管理的功能,具体的交互什么的都在各自线程里面做,这样维护起来就十分的方便。
离线渡世白玉

只看该作者 11楼 发表于: 2014-01-11
qtTcpserver好像也是异步的、、同时发送就行了、、
https://github.com/dushibaiyu/QtTcpThreadServer
每个连接一个线程、、
直接继承QTcpSocket实现处理其实就行了、、不是大型数据处理,仅仅储存,其实用不大到、、
离线baby1289

只看该作者 12楼 发表于: 2019-09-02
为每一个客户端开一个线程可以,可以子线程接受,但是怎么把写的函数也放到线程中执行,因为读写的socket要用一个啊
离线firebolt

只看该作者 13楼 发表于: 2019-09-03
如果你服务器端需要对某个客户端做操作,你可以用QSet把每个线程对象指针都存下来。
离线angelus

只看该作者 14楼 发表于: 2019-09-05
多线程编程就是 多个socket对应服务器的多个socket,服务器的每个socket都在不同的线程上,多个客户端发送的消息分别在服务器不同线程上进行处理,瓶颈其实在数据库处理上,如果只是小规模不用担心并发写入问题,如果数据太多,建议服务器多线程接收的数据进行简单格式处理,然后都塞到一个共有队列中去,这个队列可以是程序内,也可以是其他机器的队列服务器,然后逐一去把队列的内容写入数据库,这样异步处理可以最大化解决服务器多线程并发压力

每个客户端的连接,都会在服务器创建一个独立的线程进行处理,所有有多少客户端连接进来,就会创建多少个线程类,这个也是服务器压力的来源,cpu,内存,每个线程都需要占用这些资源的,除非客户端断开,不然线程会一直存在的,在线程上创建的对象也都会存在

线程池本身是为了管理有限的线程,最大化利用线程,你这个服务器程序,不需要用到线程池,除非你要写更高效的服务器,不然线程池都是没必要的

你在程序里创建的线程指针不需要自己去管理
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));  

这个信号槽会在线程结束时候qt代你延迟释放线程资源,线程什么时候结束,取决你让它什么时候结束,这些都是写代码保证的



快速回复
限100 字节
 
上一个 下一个