Advertisement
ReklatsMasters

QServer

Dec 13th, 2011
414
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.91 KB | None | 0 0
  1. //qserverthread.cpp - поток, в котором обрабатывается соединение.
  2. //
  3. #include "qserverthread.h"
  4. #include <QTime>
  5. #include <QHostAddress>
  6.  
  7. #define PRINT(x) emit QServerThread::print((QString)x);
  8.  
  9. QServerThread::QServerThread(int socketDescriptor, QObject *parent)
  10.     : QThread(parent), socketDescriptor(socketDescriptor)
  11. {
  12.     this->moveToThread(this);
  13. }
  14.  
  15. void QServerThread::run(){
  16.     QTcpSocket pClientSocket;
  17.     if (!pClientSocket.setSocketDescriptor(socketDescriptor)) {
  18.         emit error(pClientSocket.error());
  19.         return;
  20.     }
  21.  
  22.     connect(&pClientSocket, SIGNAL(readyRead()), this, SLOT(slotReadFromClient()));
  23.     connect(&pClientSocket, SIGNAL(disconnected()), this, SLOT(slotDisconnect()));
  24.     connect(&pClientSocket, SIGNAL(destroyed()), this, SLOT(quit()));
  25.  
  26.     PRINT("New connection from "+
  27.           pClientSocket.peerAddress().toString() + ":" + NUMTOSTR(pClientSocket.peerPort()))
  28.     //sendToClient(&pClientSocket,"HELLO WORLD");
  29.  
  30.     //QThread::run();
  31.     exec();
  32. }
  33.  
  34. void QServerThread::sendToClient(QTcpSocket *pClientSocket, const QString &nstr){
  35.     QByteArray dataBlock;
  36.     QDataStream out(&dataBlock, QIODevice::WriteOnly);
  37.     out.setVersion(QDataStream::Qt_4_5);
  38.     out << qint16(0) << nstr;
  39.     out.device()->seek(0);
  40.     out << qint16(dataBlock.size() - sizeof(qint16));
  41.  
  42.     pClientSocket->write(dataBlock);
  43.     PRINT("Sending data to "+
  44.           pClientSocket->peerAddress().toString() + ":" + NUMTOSTR(pClientSocket->peerPort()))
  45. }
  46.  
  47. void QServerThread::slotReadFromClient(){
  48.     QTcpSocket *pClientSocket = (QTcpSocket*)sender();
  49.     QDataStream in(pClientSocket);
  50.     in.setVersion(QDataStream::Qt_4_5);
  51.  
  52.     for(;;){
  53.         if(!m_nNextBlockSize){
  54.             if (pClientSocket->bytesAvailable() < (int)sizeof(qint16)){
  55.                 break;
  56.             }
  57.             in >> m_nNextBlockSize;
  58.         }
  59.  
  60.         if (pClientSocket->bytesAvailable() < m_nNextBlockSize){
  61.             break;
  62.         }
  63.  
  64.         QString data;
  65.         //QTime time;
  66.         in /*>> time*/ >> data;
  67.  
  68.         PRINT("Client ("+pClientSocket->peerAddress().toString()+":"+NUMTOSTR(pClientSocket->peerPort())+") has send " + NUMTOSTR(m_nNextBlockSize)+"b > " + data)
  69.         m_nNextBlockSize = 0;
  70.  
  71.         sendToClient(pClientSocket, "Server Response > Received \"" + data + "\"");
  72.     }
  73. }
  74.  
  75. void QServerThread::slotDisconnect(){
  76.     QTcpSocket *pClientSocket = (QTcpSocket*)sender();
  77.     PRINT("Client ("+pClientSocket->peerAddress().toString()+":"+
  78.           NUMTOSTR(pClientSocket->peerPort())+") is disconnected")
  79.     //pClientSocket->deleteLater();
  80. }
  81.  
  82. // qserverthread.h - класс обработчика соединения, потока
  83. //
  84. #ifndef QSERVERTHREAD_H
  85. #define QSERVERTHREAD_H
  86. #define NUMTOSTR(x) QString::number(x)
  87.  
  88. #include <QThread>
  89. #include <QTcpSocket>
  90.  
  91. class QServerThread : public QThread
  92. {
  93.     Q_OBJECT
  94.  
  95. public:
  96.     explicit QServerThread(int socketDescriptor, QObject *parent = 0);
  97.     void run();
  98.  
  99. private:
  100.     int socketDescriptor;
  101.     qint16 m_nNextBlockSize;
  102.     void sendToClient(QTcpSocket *pClientSocket, const QString &nstr);
  103.  
  104. private slots:
  105.     void slotReadFromClient();
  106.     void slotDisconnect();
  107.  
  108. signals:
  109.     void error(QTcpSocket::SocketError socketError);
  110.     void print(const QString &info);
  111. };
  112.  
  113. #endif // QSERVERTHREAD_H
  114.  
  115. //qserverbase.cpp - сервер
  116. //
  117. #include "qserverbase.h"
  118. #include "qserverthread.h"
  119.  
  120. QServerBase::QServerBase(QObject *parent) :
  121.     QTcpServer(parent)
  122. {
  123. }
  124.  
  125. void QServerBase::incomingConnection(int socketDescriptor){
  126.     QServerThread *thread = new QServerThread(socketDescriptor);
  127.     connect(thread, SIGNAL(print(QString)), this, SIGNAL(log(QString)));
  128.     connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
  129.     thread->start();
  130. }
  131.  
  132. //qserverbase.h класс сервера
  133. //
  134. #ifndef QSERVERBASE_H
  135. #define QSERVERBASE_H
  136.  
  137. #include <QTcpServer>
  138.  
  139. class QServerBase : public QTcpServer
  140. {
  141.     Q_OBJECT
  142. public:
  143.     explicit QServerBase(QObject *parent = 0);
  144.  
  145. protected:
  146.     void incomingConnection(int socketDescriptor);
  147.  
  148. signals:
  149.     void log(const QString &info);
  150.  
  151. };
  152.  
  153. #endif // QSERVERBASE_H
  154.  
  155. //qserver.cpp
  156. //
  157. #include "qserver.h"
  158.  
  159. #include <QtNetwork>
  160. #include <QtGui>
  161.  
  162. #define PRINT(x) QServer::m_ptxtedit->append(QTime::currentTime().toString()+" "+(QString)x + "\n---------");
  163. #ifndef NUMTOSTR()
  164.     #define NUMTOSTR(x) QString::number(x)
  165. #endif
  166.  
  167. QServer::QServer(int nPort, QWidget *parent)
  168.     : QWidget(parent), m_nNextBlockSize(0), m_nPort(nPort)
  169. {
  170.     m_ptxtedit = new QTextEdit;
  171.     m_ptxtedit->setReadOnly(true);
  172.     QVBoxLayout *pvboxlayout = new QVBoxLayout;
  173.     pvboxlayout->addWidget(new QLabel(tr("<h1>Multi-Threaded Server<h1>")));
  174.     pvboxlayout->addWidget(m_ptxtedit);
  175.     setLayout(pvboxlayout);
  176.     resize(400,300);
  177.     setWindowTitle(tr("Threaded TCP Server"));
  178.  
  179.     QNetworkConfigurationManager manager;
  180.     if (manager.capabilities() & QNetworkConfigurationManager::NetworkSessionRequired){
  181.         QNetworkConfiguration config;
  182.         config = manager.defaultConfiguration();
  183.         m_pnetworkSession = new QNetworkSession(config, this);
  184.         PRINT("Session opening");
  185.         connect(m_pnetworkSession, SIGNAL(opened()), this, SLOT(sessionOpened()));
  186.         m_pnetworkSession->open();
  187.     }
  188.     else{
  189.         sessionOpened();
  190.     }
  191. }
  192.  
  193. QServer::~QServer(){
  194.     delete m_pServerBase;
  195. }
  196.  
  197. void QServer::sessionOpened(){
  198.     m_pServerBase = new QServerBase(this);
  199.     if (!m_pServerBase->listen(QHostAddress::Any, m_nPort)){
  200.         PRINT("Error starting server > "+m_pServerBase->errorString());
  201.         m_pServerBase->close();
  202.         return;
  203.     }
  204.     else
  205.         PRINT("Server started on "+m_pServerBase->serverAddress().toString()+":"+NUMTOSTR(m_pServerBase->serverPort()));
  206.     //connect(m_ptcpServer, SIGNAL(newConnection()), this, SLOT(newConnection()));
  207.     connect(m_pServerBase, SIGNAL(log(QString)), this, SLOT(slotShowLog(QString)));
  208. }
  209.  
  210. void QServer::slotShowLog(const QString &log){
  211.     PRINT(log)
  212. }
  213.  
  214. //qserver.h
  215. //
  216. #ifndef QSERVER_H
  217. #define QSERVER_H
  218.  
  219. #include <QtGui/QWidget>
  220. #include "qserverbase.h"
  221.  
  222. QT_BEGIN_NAMESPACE
  223. //class QTcpServer;
  224. class QNetworkSession;
  225. class QTextEdit;
  226. class QTcpSocket;
  227. QT_END_NAMESPACE
  228.  
  229. class QServer : public QWidget
  230. {
  231.     Q_OBJECT
  232.  
  233. public:
  234.     QServer(int nPort, QWidget *parent = 0);
  235.     ~QServer();
  236.  
  237. private:
  238.     QNetworkSession *m_pnetworkSession;
  239.     //QTcpServer      *m_ptcpServer;
  240.     QServerBase     *m_pServerBase;
  241.     QTextEdit       *m_ptxtedit;
  242.     qint16          m_nNextBlockSize;
  243.     int             m_nPort;
  244.  
  245.     //void sendToClient(QTcpSocket *pSocket, const QString& nStr);
  246.  
  247. private slots:
  248.     void sessionOpened();
  249.     //virtual void newConnection();
  250.     //virtual void newDisconnection();
  251.     //void readFromClient();
  252.     void slotShowLog(const QString &log);
  253. };
  254.  
  255. #endif // QSERVER_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement