关于QT客户端,多线程服务器的问题

myseemylife 2011-10-14 10:48:45
写一个c/s模式的程序。现在已经实现客户端与server双向通信。
但是有一个问题。
比如客户端有一个登录操作。用户点击登录,client会把操作和数据封装好发送给server,比说“login + username+ password”。server收到数据,解析完了之后去查询数据库。每一个tcp连接。server都会开启一个线程来操作。
现在我想。。。可不可以查询数据库的操作都在client这边操作。操作完之后,client发消息给server。,server再转发给其他client。client收到信息在做不同的更新。
这两种做法怎么样?哪种好。。。或者有更好的更有效率的告诉我。。
100分送上
...全文
475 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhy282289 2011-10-14
  • 打赏
  • 举报
回复
据我知道:Qt没有提供这种解决方案~你就服务器一个线程对应一个TCP
如果只在WINDOWS的话,有大量连接你就用:完成端口,不多就用异步选择模式之类的
~具体实现当然要你自己去看了O O
乔巴好萌 2011-10-14
  • 打赏
  • 举报
回复
密码你用MD5就可以 服务器发送一个challenge 根据这个challenge生成MD5的密码做校验
乔巴好萌 2011-10-14
  • 打赏
  • 举报
回复
不要让客户端直接连DB 这是很不好的设计模式和方法
这意味着你要把数据库的URL 权限 密码公开 有风险 如果你server和DB分开放 意味着你要在client中配置2个URL 一个DB的 一个server的
而如果放在server端 DB和server可以分开放
所有的查询操作应该放在server端 由server提供一些接口给客户端使用
另外 服务器没必要多线程做认证
一般来说 认证都是一个很快的过程 你服务器采用select这样的模型就可以了
就这样好了 2011-10-14
  • 打赏
  • 举报
回复
只比较这两种的方法的情况下第二种方法会有比较严重的安全隐患。
但是第一种在客户端一朵的情况下服务端大量线程创建销毁也是不小的开销。服务端的负荷可不小
其他方法可以考虑诸如I/O复用
myseemylife 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhy282289 的回复:]
client自己去连数据库?额...他查数据库里的账号密码对比?..汗
不带这样的吧~这种设计就是错的.数据库都连上了账号密码有什么用~
[/Quote]

那你有什么好方法吗?
zhy282289 2011-10-14
  • 打赏
  • 举报
回复
client自己去连数据库?额...他查数据库里的账号密码对比?..汗
不带这样的吧~这种设计就是错的.数据库都连上了账号密码有什么用~
LinuxCard 2011-10-14
  • 打赏
  • 举报
回复
client直接连数据库,有100个client,就要开100个数据库连接,数据库负载大了
myseemylife 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aaa20090987 的回复:]
我用第一种
[/Quote]

为啥?我挺想用第二种的,服务器只来做信息分发。。。反正数据库在server端。client已启动就连接数据库。推出就断开。
如果第一种的话。次线程和主线程那个里面操作数据库呢?还有查询出的数据线程间来传递。。。感觉很麻烦啊。。server做的事情太多了
AAA20090987 2011-10-14
  • 打赏
  • 举报
回复
我用第一种
myseemylife 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 openxmpp 的回复:]
很早的时候 我做过这样一个实验
一台机子上起2个QQ 一个QQ发敏感关键字 当时好像那个敏感关键字就是baidu的一个URL(记不清了,但可以肯定的是QQ的竞争对象) 但另一个QQ就没收到 所以说感觉像被服务器过滤掉了
[/Quote]
谢谢。。思路清晰多了~~~80分给你了~~~
乔巴好萌 2011-10-14
  • 打赏
  • 举报
回复
很早的时候 我做过这样一个实验
一台机子上起2个QQ 一个QQ发敏感关键字 当时好像那个敏感关键字就是baidu的一个URL(记不清了,但可以肯定的是QQ的竞争对象) 但另一个QQ就没收到 所以说感觉像被服务器过滤掉了
乔巴好萌 2011-10-14
  • 打赏
  • 举报
回复
对的
走服务器转发模式比较好
不是所有的P2P都可以成功
特别是在公网上 还有对称型NAT 是没法P2P的
你走转发模式还有一个比较好的地方是 可以保存离线消息
比如A和B正通话呢 但B突然掉线 这时心跳还在 服务器没有刷新B状态 A以为B在线 给B发消息 转发到服务器上时 服务器发现B不在了 可以保存离线消息

[Quote=引用 19 楼 myseemylife 的回复:]
引用 12 楼 openxmpp 的回复:
你那个地方没必要用多线程把,你看看QTCpserver,我感觉应该够了。


另外。。。类似于QQ里面的。AB两个人已经开始聊天了。A点一下窗口抖动(比如)。B那边串口就会抖。
这个过程中,client A----sendMessage()-----server(接受,转发)-----sendMessage()
->B->B->shake()……
[/Quote]
wangxkww 2011-10-14
  • 打赏
  • 举报
回复
QQ单对单聊天应该是点对点的吧 不会在走server……
myseemylife 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 openxmpp 的回复:]
你那个地方没必要用多线程把,你看看QTCpserver,我感觉应该够了。
[/Quote]

另外。。。类似于QQ里面的。AB两个人已经开始聊天了。A点一下窗口抖动(比如)。B那边串口就会抖。
这个过程中,client A----sendMessage()-----server(接受,转发)-----sendMessage()
->B->B->shake();大致是这样一个过程吧?
myseemylife 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 aaa20090987 的回复:]
想说的楼上都已经说了

我也写过一个这样的程序,有兴趣的可以看一下:
http://topic.csdn.net/u/20110417/12/ad74c499-f0f7-437a-bbec-ad51b8028c92.html
[/Quote]
好厉害~~~~那你今年应该是去参加校招了吧~~
myseemylife 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 openxmpp 的回复:]
由server封装了一些实现 供客户端调用
1 首先 DB 本身并不强调的是多并发,大多数DB强调的是事物的持久可靠的保存,很少说有DB说自己支持大并发的。一般DB的并发不会太高,但是DB会强调一些读写和可靠性存储。 所以你这里用多个客户端去连DB本身就不是DB的强项。 一般server会维持和DB的若干个连接,所有的操作是在这有限的连接里做。

2 如果客户端由于某些原因没有释放DB连接……
[/Quote]

恩,再次谢谢openxmpp。。。。。我去重构下~~~~~
blueness883 2011-10-14
  • 打赏
  • 举报
回复
每一个tcp连接。server都会开启一个线程来操作。

这设计。。。。。。。。。。。。。。
AAA20090987 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 aaa20090987 的回复:]

另外,因为QT的信号糟比较好用,
在数据量不大的情况下没什么优势。
[/Quote]

在数据量不大的情况下,用多线程没什么优势。
AAA20090987 2011-10-14
  • 打赏
  • 举报
回复
另外,因为QT的信号糟比较好用,
在数据量不大的情况下没什么优势。
AAA20090987 2011-10-14
  • 打赏
  • 举报
回复
想说的楼上都已经说了

我也写过一个这样的程序,有兴趣的可以看一下:
http://topic.csdn.net/u/20110417/12/ad74c499-f0f7-437a-bbec-ad51b8028c92.html
加载更多回复(3)

16,240

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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