2012-08-22 36 views
1

任何人都可以告诉我,如果我这样做的权利?实现一个TCP服务器

使用Qt我正在通过继承QTcpServer类来实现TCP服务器。在传入的连接上,我创建一个新线程,一个新的Worker对象,然后将对象移动到新线程并启动线程。从这里开始,服务器不断监听新客户端,然后每个线程都处于对象Worker的运行方法中。

现在,我创建了一个计时器,因为我需要根据1秒的时间间隔和每首歌曲播放时,向每个客户端发送更新。在readyRead插槽中,我使用readAll读取数据,然后执行一些工作并发送回复。

但是,当我回到我的运行方法时,我需要继续向客户端发送歌曲数据更新(没有来自客户端的响应)。如果这一切只是在一段时间(真)循环,然后我检查一些布尔启动和停止计时器?我需要发送的曲目信息是曲目进行时间。

我想我的问题是,我应该这样做吗?看起来有点复杂,但是对于你来说,这又是一个并发。基本上我需要TCP服务器在一些条件为真时重复地向客户端发送数据。我觉得只是一个无尽的while循环,检查何时开始和停止计时器是无用的工作。

张贴代码会使这个更清晰吗?

+1

有一次,我做了TCP上传服务器哪些客户端可以上传文件。我有一个QTcpServer和许多QTCPSockets。我创建了一个派生自QTCPSocket的类,并具有一些数据接收功能。和你一样,当服务器接收到一个传入连接时,它为具有线程ID或套接字ID的QTCPSocket创建一个新线程。服务器和套接字通过信号和插槽连接。 –

回答

0

这个问题是一个非常古老的问题,但也许它仍然有帮助。

关于Qt中的线程:
很多人认为关于Qt的并行处理像在.NET中,你需要为每个操作另一个线程,在QT这是没有必要的!
Qt中你只需要一个线程,如果你有这样计算的大事情或者从一个SQLServer

等待为SYNCRON一个答案,如果我有正确理解你,你没有这样的阻塞操作阻塞代码。
所以我有编程的一个非常小的TCPSERVER没有继承,没有一个单独的线程(当然,除了主事件循环线程),它有望解决您的问题,并帮助他人:

#include <QObject> 
#include <QSet> 
#include <QTcpServer> 
#include <QTcpSocket> 
#include <QTimer> 

class TcpServer : public QObject 
{ 
    Q_OBJECT 
    public: 
     TcpServer() 
     { 
      // handle new connections 
      this->connect(&this->serverTcp, &QTcpServer::newConnection, this, &TcpServer::handleClientConnect); 

      // init client refresh timer 
      this->timer.setInterval(1000); 
      this->connect(&this->timer, &QTimer::timeout, this, &TcpServer::handleClientUpdates); 
      this->timer.start(); 
     } 

     bool startListen(qint16 port) 
     { 
      return this->serverTcp.listen(QHostAddress::Any, port); 
     } 

    private slots: 
     void handleClientConnect() 
     { 
      QTcpSocket* socketClient = *this->setConnectedClients.insert(this->serverTcp.nextPendingConnection()); 
      this->connect(socketClient, &QTcpSocket::disconnected, this, &TcpServer::handleClientDisconnect); 
      this->connect(socketClient, &QTcpSocket::readyRead, this, &TcpServer::handleClientData); 
     } 

     void handleClientDisconnect() 
     { 
      this->setConnectedClients.remove((QTcpSocket*)this->sender()); 
     } 

     void handleClientData() 
     { 
      QTcpSocket* socketSender = (QTcpSocket*)this->sender(); 
      // handle here the data sent by the client 
     } 

     void handleClientUpdates() 
     { 
      // construct here your update data 
      QByteArray baUpdateResponse = "test"; 

      // send update data to all connected clients 
      foreach(QTcpSocket* socketClient, this->setConnectedClients) { 
       socketClient->write(baUpdateResponse); 
      } 
     } 

    private: 
     QTcpServer serverTcp; 
     QTimer timer; 
     QSet<QTcpSocket*> setConnectedClients; 
};