// thread.cpp
#include "thread.h"
Thread::Thread(int socketDescriptor, QObject *parent)
: QThread(parent)
{
m_socketDescriptor = socketDescriptor;
}
Thread::~Thread()
{
}
void Thread::run()
{
m_tcpSocket = new QTcpSocket;
if (!m_tcpSocket->setSocketDescriptor(m_socketDescriptor))
{
emit error(m_tcpSocket->error());
return;
}
connect(m_tcpSocket,SIGNAL(readyRead()),this, SLOT(readData_slot()), Qt::DirectConnection); // Qt::DirectConnection线程内传递消
connect(m_tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(tcpSocket_error_slot()));
connect(m_tcpSocket,SIGNAL(disconnected()),this,SLOT(quit()));//socket断开连接。线程退出
qDebug() << "run" << m_tcpSocket->peerAddress().toString();
qDebug() << "run" << m_tcpSocket->peerPort();
exec();
}
void Thread::readData_slot()
{
QDataStream in(m_tcpSocket);
in.setVersion(QDataStream::Qt_5_0);
QDataStream out(m_tcpSocket);
out.setVersion(QDataStream::Qt_5_0);
QString data;
in >> data;
qDebug() << "readData_slot" << data;
data = "hello this is server";
out << data;
qDebug() << data;
}
void Thread::tcpSocket_error_slot()
{
qDebug() << m_tcpSocket->errorString();
}
// server.cpp
#include "server.h"
Server::Server(QObject *parent)
: QTcpServer(parent)
{
}
Server::~Server()
{
}
void Server::incomingConnection(qintptr socketDescriptor)
{
Thread *thread = new Thread(socketDescriptor, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
// dialog.cpp
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QWidget(parent)
{
m_statusLabel = new QLabel;
m_statusLabel->setWordWrap(true);
m_quitButton = new QPushButton(tr("Quit"));
m_quitButton->setAutoDefault(false);
QString ipAddress;
QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
// use the first non-localhost IPv4 address
for (int i=0; i <ipAddressesList.size(); ++i)
{
if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
ipAddressesList.at(i).toIPv4Address())
{
ipAddress = ipAddressesList.at(i).toString();
break;
}
}
// if we did not find one, use IPv4 localhost
if (ipAddress.isEmpty())
{
ipAddress = QHostAddress(QHostAddress::LocalHost).toString();
}
m_statusLabel->setText(tr("The server is running on\n\nIP: %1\nport: %2\n\n"
"Run the Client example now.")
.arg(ipAddress).arg(m_server.serverPort()));
connect(m_quitButton, SIGNAL(clicked()), this, SLOT(close()));
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addStretch(1);
buttonLayout->addWidget(m_quitButton);
buttonLayout->addStretch(1);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(m_statusLabel);
mainLayout->addLayout(buttonLayout);
setLayout(mainLayout);
setWindowTitle(tr("Threaded Server"));
if (!m_server.listen(QHostAddress::Any, 1314))
{
QMessageBox::critical(this, tr("Threaded Server"),
tr("Unable to start the server: %1.")
.arg(m_server.errorString()));
close();
return;
}
}
Dialog::~Dialog()
{
}这是我參照http://m.blog.csdn.net/blog/sdu_sky/8104175这位大神的博客和QT的多线程server源代码写出来的,
可是我又两个地方不明确,在dialog.cpp中
if (!m_server.listen(QHostAddress::Any, 1314))
这一句如何就能在监听成功之后创建一个新的线程。
void Server::incomingConnection(qintptr socketDescriptor)还有这个函数没有在构造函数里实现。也没有显式的调用???这是怎么回事。望高手指导