Hi,
I’m trying to create a threaded server and in every example I saw someone creates a server by inheriting from QTcpServer. So I wonder, do I have to? I mean, you inherit only if you want to extend the class.
Here is the class:
myserver.h
#ifndef MYSERVER_H
#define MYSERVER_H
#include <QObject>
#include <QtNetwork/QTcpServer>
#include <QtConcurrentRun>
#include <QFuture>
#include "myclienthandle.h"
{
Q_OBJECT
public:
explicit MyServer
(QObject *parent
= 0,
const QString &ip
= "Any",
int port
= 0);
explicit MyServer(const MyServer &server);
~MyServer();
int Port() const;
void setPort(int port);
bool isAlive() const;
private:
QFuture<void> m_qftrRun;
int m_iPort;
int m_iClientID;
bool m_bRun;
void run();
signals:
void newConnection(MyClientHandle *clientHandle);
public slots:
void start();
void stop();
};
inline QString MyServer
::IP() const {
return *m_qstrIP;
}
inline void MyServer
::setIP(const QString &ip
) {
}
inline int MyServer::Port() const
{
return m_iPort;
}
inline void MyServer::setPort(int port)
{
m_iPort = port;
}
inline bool MyServer::isAlive() const
{
return m_bRun;
}
#endif // MYSERVER_H
#ifndef MYSERVER_H
#define MYSERVER_H
#include <QObject>
#include <QtNetwork/QTcpServer>
#include <QtConcurrentRun>
#include <QFuture>
#include "myclienthandle.h"
class MyServer : public QObject
{
Q_OBJECT
public:
explicit MyServer(QObject *parent = 0, const QString &ip = "Any", int port = 0);
explicit MyServer(const MyServer &server);
~MyServer();
QString IP() const;
void setIP(const QString &ip);
int Port() const;
void setPort(int port);
bool isAlive() const;
private:
QTcpServer *m_qtcpserListener;
QFuture<void> m_qftrRun;
QString *m_qstrIP;
int m_iPort;
int m_iClientID;
bool m_bRun;
void run();
signals:
void newConnection(MyClientHandle *clientHandle);
public slots:
void start();
void stop();
};
inline QString MyServer::IP() const
{
return *m_qstrIP;
}
inline void MyServer::setIP(const QString &ip)
{
m_qstrIP = new QString(ip);
}
inline int MyServer::Port() const
{
return m_iPort;
}
inline void MyServer::setPort(int port)
{
m_iPort = port;
}
inline bool MyServer::isAlive() const
{
return m_bRun;
}
#endif // MYSERVER_H
To copy to clipboard, switch view to plain text mode
myserver.cpp
#include "myserver.h"
QObject(parent
), m_iClientID
(0), m_bRun
(false) {
setIP(ip);
setPort(port);
}
MyServer::MyServer(const MyServer &server)
{
MyServer(server.parent(), server.IP(), server.Port());
}
MyServer::~MyServer()
{
stop();
}
void MyServer::run()
{
{
return;
}
while (m_bRun)
{
QTcpSocket *qtcpsoNextPending
= m_qtcpserListener
->nextPendingConnection
();
if(qtcpsoNextPending != 0)
{
emit newConnection(new MyClientHandle(qtcpsoNextPending));
}
}
}
void MyServer::start()
{
m_bRun = true;
m_qftrRun = QtConcurrent::run(this, &MyServer::run);
}
void MyServer::stop()
{
m_bRun = false;
if (m_qtcpserListener->isListening())
{
m_qtcpserListener->close();
}
}
#include "myserver.h"
MyServer::MyServer(QObject *parent, const QString &ip, int port) :
QObject(parent), m_iClientID(0), m_bRun(false)
{
setIP(ip);
setPort(port);
}
MyServer::MyServer(const MyServer &server)
{
MyServer(server.parent(), server.IP(), server.Port());
}
MyServer::~MyServer()
{
stop();
}
void MyServer::run()
{
m_qtcpserListener = new QTcpServer(this);
if (!m_qtcpserListener->listen(QHostAddress(IP()), Port()))
{
return;
}
while (m_bRun)
{
QTcpSocket *qtcpsoNextPending = m_qtcpserListener->nextPendingConnection();
if(qtcpsoNextPending != 0)
{
emit newConnection(new MyClientHandle(qtcpsoNextPending));
}
}
}
void MyServer::start()
{
m_bRun = true;
m_qftrRun = QtConcurrent::run(this, &MyServer::run);
}
void MyServer::stop()
{
m_bRun = false;
if (m_qtcpserListener->isListening())
{
m_qtcpserListener->close();
}
}
To copy to clipboard, switch view to plain text mode
Greats p.kreker
Bookmarks