5,530
社区成员
发帖
与我相关
我的任务
分享
TEMPLATE = app
QT += core network
QT -= gui
TARGET = TEST
HEADERS += myobject.h
SOURCES += myobject.cpp
#ifndef _MY_OBJECT_H_
#define _MY_OBJECT_H_
#include <QEvent>
#include <QTcpSocket>
#include <QTcpServer>
#include <QThread>
#include <QDebug>
#include <QObject>
#include <QTimer>
#include <QObject>
#include <QHostAddress>
const QEvent::Type TYPE_ADDR = (QEvent::Type)5001;
const QEvent::Type TYPE_ITC = (QEvent::Type)5002;
struct ConnectAddr : public QEvent
{
ConnectAddr(const QHostAddress &ip,
quint16 port)
: QEvent(TYPE_ADDR),
m_ip(ip),
m_port(port) {}
const QHostAddress m_ip;
const quint16 m_port;
};
struct ITC : public QEvent
{
ITC(const QString& data)
: QEvent(TYPE_ITC),
m_data(data) {}
const QString m_data;
};
class MyObject : public QObject
{
Q_OBJECT
public:
MyObject();
protected Q_SLOTS:
void Started();
void TriggerNewConnection();
void TriggerDataReceived();
protected:
virtual void customEvent(QEvent *e);
void Connect(const QHostAddress &connectAddr,
quint16 nConnectPort);
private:
QTcpServer *m_pTcpServer;
};
#endif // _MY_OBJECT_H_
#include <QCoreApplication>
#include "myobject.h"
MyObject::MyObject():m_pTcpServer(NULL)
{
}
void MyObject::Started()
{
qDebug() << QString("[%1]Started")
.arg((qlonglong)QThread::currentThreadId());
}
void MyObject::Connect(const QHostAddress &connectAddr,
quint16 nConnectPort)
{
if(!m_pTcpServer)
{
m_pTcpServer = new QTcpServer(this);
connect(m_pTcpServer, SIGNAL(newConnection()), this , SLOT(TriggerNewConnection()));
}
if(!m_pTcpServer->listen(connectAddr, nConnectPort))
{
delete m_pTcpServer;
m_pTcpServer = NULL;
}
}
void MyObject::customEvent(QEvent *e)
{
switch(e->type())
{
case TYPE_ADDR:
{
ConnectAddr *addr = static_cast<ConnectAddr*>(e);
qDebug() << QString("[%1]catch the event: connect-addr(%2 %3)")
.arg((qlonglong)QThread::currentThreadId())
.arg(addr->m_ip.toString())
.arg(addr->m_port);
Connect(addr->m_ip, addr->m_port);
}
break;
case TYPE_ITC:
{
ITC *itc = static_cast<ITC*>(e);
qDebug() << QString("[%1]catch the event: itc(%2)")
.arg((qlonglong)QThread::currentThreadId())
.arg(itc->m_data);
}
break;
default:
break;
}
}
void MyObject::TriggerNewConnection()
{
QTcpSocket *socket = m_pTcpServer->nextPendingConnection();
if(NULL == socket)
{
qDebug() << QString("[%1]TriggerNewConnection: Socket is null")
.arg((qlonglong)QThread::currentThreadId());
return ;
}
connect(socket, SIGNAL(readyRead()), this, SLOT(TriggerDataReceived()));
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
qDebug() << QString("[%1]TriggerNewConnection: %2 %3")
.arg((qlonglong)QThread::currentThreadId())
.arg(socket->peerAddress().toString())
.arg(socket->peerPort());
}
void MyObject::TriggerDataReceived()
{
QTcpSocket* socket = dynamic_cast<QTcpSocket*>(sender());
QByteArray data = socket->readAll();
qDebug() << QString("[%1]TriggerDataReceived: %2")
.arg((qlonglong)QThread::currentThreadId())
.arg(QString::fromUtf8(data));
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyObject* myObj = new MyObject;
QThread *thread = new QThread();
myObj->moveToThread(thread);
thread->start();
QObject::connect(thread, SIGNAL(started()), myObj, SLOT(Started()), Qt::QueuedConnection);
QCoreApplication::postEvent(myObj, new ConnectAddr(QHostAddress::Any, 12345));
for(qint32 i = 0; ; i++) {
QEventLoop EventLoop;
QTimer::singleShot(3*1000, &EventLoop, SLOT(quit()));
EventLoop.exec();
QCoreApplication::postEvent(myObj, new ITC(QString("I have been running %1 times.").arg(i)));
}
return a.exec();
}