我在Qt Creator中写了简单的Qt client-server。如果我从Qt Creator运行它它正在工作,但如果我在源目录中尝试qmake-make
并运行为./MyServer
,那么我得到消息服务器正在侦听但不显示已连接的客户端且它没有响应客户命令:
#include <QCoreApplication>
#include "myserver.h"
int main(int argc, char *argv[])
{
QCoreApplication serv(argc, argv);
MyServer server;
server.startServer();
return serv.exec();
}
这是 MyServer.h :
#ifndef MYSERVER_H
#define MYSERVER_H
#include <QTcpServer>
#include "mythread.h"
class MyServer : public QTcpServer
{
Q_OBJECT
public:
explicit MyServer(QObject *parent = 0);
void startServer();
signals:
public slots:
protected:
void incomingConnection(int socketDescriptor);
};
#endif // MYSERVER_H
这是 MyServer.cpp :
#include "myserver.h"
#include "mythread.h"
MyServer::MyServer(QObject *parent) :
QTcpServer(parent)
{
}
void MyServer::startServer()
{
if (!this->listen(QHostAddress::Any, 1111))
{
qDebug() << "Could not start server";
}
else
{
qDebug() << "listen...";
}
}
void MyServer::incomingConnection(int socketDescriptor)
{
qDebug() << socketDescriptor << " Connecting...";
MyThread *thread = new MyThread(socketDescriptor, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
这是 MyThread.h :
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QTcpSocket>
#include <QDebug>
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(int SD, QObject *parent = 0);
void run();
signals:
void error(QTcpSocket::SocketError socketerror);
public slots:
void readyRead();
void disconnected();
private:
QString answer(QString str);
QString getDataParam(QString str);
int getKeyParam(QString str);
QTcpSocket *socket;
int socketDescriptor;
int key;
QString data;
};
#endif
和 MyThread.cpp :
#include "mythread.h"
MyThread::MyThread(int SD, QObject *parent) :
QThread(parent)
{
this->socketDescriptor = SD;
}
void MyThread::run()
{
qDebug() << "Thread started";
socket = new QTcpSocket();
if(!socket->setSocketDescriptor(this->socketDescriptor))
{
emit error(socket->error());
return;
}
connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()), Qt::DirectConnection);
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
qDebug() << socketDescriptor << " Client connected";
exec();
}
int MyThread::getKeyParam(QString str)
{
QString temp;
int res;
bool ok;
int start = str.indexOf('(');
int end = str.indexOf(',', start);
if (start == -1 || end == -1)
return (-2);
start++;
temp = str.mid(start, end - start);
res = temp.toInt(&ok, 10);
if (ok == false)
return (-1);
return (res);
}
QString MyThread::getDataParam(QString str)
{
QString temp;
int start = str.indexOf(',');
int end = str.indexOf(')', start);
if (start == -1 || end == -1)
return (NULL);
start++;
temp = str.mid(start, end - start);
return (temp);
}
QString MyThread::answer(QString str)
{
if (QString::compare(str, "hello", Qt::CaseInsensitive) == 1)
return ("Hello i`m your echo server\n");
else if (QString::compare(str, "--help", Qt::CaseInsensitive) == 1)
return ("you can use this commands:\nhello\nget_param\nset_param(key,data)\ndisc\n");
else
return ("can`t find this command. use \"--help\" and try again\n");
return (NULL);
}
void MyThread::readyRead()
{
QString str = socket->readAll();
QByteArray array;
if (QString::compare(str, "disc", Qt::CaseInsensitive) == 1)
socket->close();
if (str.startsWith("set_param"))
{
data = MyThread::getDataParam(str);
key = MyThread::getKeyParam(str);
}
else if (str.startsWith("get_param"))
{
if (key == -1)
array.append("key not number\n");
else if (key == -2 || data == NULL)
array.append("wrong, use \"set_param(key,data)\" correctly\n");
else if (data == "" || key == 0)
array.append("no param\n");
else
array.append("param key:" + QString::number(key) + "\nparam data:" + data +"\n");
}
else
{
array.append(MyThread::answer(str));
}
socket->write(array);
}
void MyThread::disconnected()
{
qDebug() << socketDescriptor << " Disconnected";
socket->deleteLater();
exit(0);
}