本文主要解决的问题是:
一、一个服务端怎么处理多客户端的连接?
二、一个服务端怎么开启多个线程来处理所有客户端发来的消息?(换汤不换药,可以看这篇博客Qt封装一个类管理moveToThread( )正确的开启多线程、安全的退出线程的实例不管是开启多个客户端还是一个服务端开启多个线程都可以用此方法)这里我们还需要考虑弄一个全局的缓存区暂时来存放从客户端收到的消息,因为有时候服务端对消息的处理速度慢时,可能会造成数据丢失这些原因。
一些用到的函数等解释:
| void incomingConnection ( int socketDescriptor ) | 当有新连接可用时,QTcpServer将调用此虚拟函数。注意:如果希望将传入连接作为另一个线程中的新QTcpSocket对象处理,则必须将socketDescriptor传递给另一个线程,在那里创建QTcpSocket对象并使用其setSocketDescriptor()方法。 |
一、一个服务端怎么处理多客户端的连接?
首先要知道在QT中有QTcpServer来进行TCP通信,每个客户端连接到服务端时,这个QTcpSever会给他们分配一个socket。
伪代码:
/************
1 创建一个QTcpSever
2 监听端口
3 QTcpSever有客户端连接上来是,会触发newConnection信号,或者incomingConnection虚函数
4 创建一个QList来存储QTcpSocket,后续需要用到每个客户端对应的socket时,在这个容器里取出就行了。
************/
1 在这里我用到了重写虚函数incomingConnection继承QTcpServer的方法来实现一个服务端如何处理多个客户端的连接,
2 当然也可以不用这种方法,直接在触发readReady信号时遍历容器即可,可以看本篇博客QT TCP服务端处理多个客户端发来的消息
2的这种方法比较容易看懂,但是1也很简单,现在我们来看1的方法怎么实现吧。
在这里我把QTcpSever和QTcpSocket的处理封装成两个类,比较有MVC的那种分层管理的想法;当然你也可以不用封装成两个类,封装成一个也行。
调用代码示例:如此我们便开启了一个可以处理多个客户端发来的消息的服务器了
SeverBy


1万+

被折叠的 条评论
为什么被折叠?



