2012-08-22 86 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; 
};