I'm writing a simple multithreaded server and I wind up with this code:
ServerThread
::ServerThread(int handle,
QObject* parent
){
m_descriptor = handle;
init();
}
void ServerThread::run()
{
if(!m_socket->setSocketDescriptor(m_descriptor))
{
qDebug("Socket Error!");
exit(-1);
}
connect(m_socket, SIGNAL(readyRead()), this, SLOT(ready()),Qt::DirectConnection);
m_socket->waitForReadyRead(10000);
}
void ServerThread::ready()
{
disconnect(m_socket, SIGNAL(readyRead()));
//Check incoming command
if(m_socket->canReadLine())
{
switch(map.value(tokens[0]))
{
case GETA:
doSomeThing();
break;
case GETB:
doSomeThing();
break;
case QUIT:
m_socket->disconnectFromHost();
break;
default:
m_socket->disconnectFromHost();
return;
}
}
}
ServerThread::ServerThread(int handle, QObject* parent)
:QThread(parent)
{
m_descriptor = handle;
init();
}
void ServerThread::run()
{
m_socket = new QTcpSocket();
if(!m_socket->setSocketDescriptor(m_descriptor))
{
qDebug("Socket Error!");
exit(-1);
}
connect(m_socket, SIGNAL(readyRead()), this, SLOT(ready()),Qt::DirectConnection);
m_socket->waitForReadyRead(10000);
}
void ServerThread::ready()
{
disconnect(m_socket, SIGNAL(readyRead()));
//Check incoming command
if(m_socket->canReadLine())
{
QStringList tokens = QString(m_socket->readLine()).split(QRegExp("[\r\n][\r\n]*"));
switch(map.value(tokens[0]))
{
case GETA:
doSomeThing();
break;
case GETB:
doSomeThing();
break;
case QUIT:
m_socket->disconnectFromHost();
break;
default:
m_socket->disconnectFromHost();
return;
}
}
}
To copy to clipboard, switch view to plain text mode
The above code works, but is it a good way to do it ?
Bookmarks