Z racji że dopiero zaczynam programować w QT napisałem aplikacje klient serwer. Chciałbym ją krok po kroku ulepszyć (dodać GUI itp). Na wstępie całkowicie nie wiem jak zmusić serwer do działania współbieżnego. Macie jakieś doświadczenie ?
serwer.cpp
#include "zmienneserwer.h"
CQTSerwer::CQTSerwer(int port, int backlog, QObject parent, const char name)
: CSocketServer(port, backlog, parent, name)
{
connect(this, SIGNAL(newConnect(CSocketClient)), SLOT(newConnect_slot(CSocketClient)));
}
void CQTSerwer::newConnect_slot(CSocketClient *s)
{
qWarning("Podłączono klienta z numeru IP %s:%i", s->address().toString().latin1(), s->port());
connect(s, SIGNAL(connectionClosed()), this, SIGNAL(finished()));
new CQTSerwerClient(s);
}
serwerclient.cpp
#include "zmienneserwerclient.h"
CQTSerwerClient::CQTSerwerClient(CSocketClient *client)
: m_pClient(client)
{
connect(client, SIGNAL(message(const QVariant &)), SLOT(message_slot(const QVariant &)));
connect(client, SIGNAL(connectionClosed()), SLOT(connectionClosed_slot()));
qWarning("Podłączono klienta.");
}
void CQTSerwerClient::message_slot(const QVariant &msg)
{
QMap<QString, QVariant> data;
data = msg.toMap();
QMap<QString, QVariant>::Iterator it;
for (it = data.begin(); it != data.end(); ++it)
{
if (QFile::exists(it.key()))
{
qWarning("Plik istnieje już na serwerze");
}
else
{
QFile file(it.key());
if (file.open(IO_WriteOnly | IO_Truncate))
{
file.writeBlock(it.data().toByteArray());
file.close();
qWarning("==> %s zapis.", it.key().latin1());
}
else
{
qWarning("Nie można otworzyć pliku %s", it.key().latin1());
}
}
}
}
void CQTSerwerClient::connectionClosed_slot()
{
qWarning("Połączenie klienta zakończone.");
}
Main.cpp
#include <qaccel.h>
#include <qapplication.h>
#include "zmienneserwer.h"
int main(int argc, char **argv)
{
QApplication a(argc, argv, false);
int port = 54321;
if (argc>1)
port = QString(argv[1]).toInt();
else
qWarning("Nie wybrałeś portu serwera: Domyślny port to 54321 ");
qWarning("Aby uruchomić serwer na wybranym przez siebie porcie\npodaj go po wywołaniu programu");
qWarning("\nPrzykład ./serwer <port>");
qWarning("Uruchamianie serwera na porcie: %i", port);
CQTSerwer server(port);
if (server.ok())
{
qWarning("Serwer uruchomiony.");
qWarning("Oczekiwanie na połączenie Klienta");
QObject::connect(&server, SIGNAL(finished()), &a, SLOT(quit()));
return a.exec();
}
return 0;
}
Zmienneserwer.h
#ifndef CQTSERWER_H
#define CQTSERWER_H
#include "../socket/socket.h"
#include "zmienneserwerclient.h"
class CQTSerwer : public CSocketServer
{
Q_OBJECT
public:
CQTSerwer(int port, int backlog = 50, QObject *parent = 0, const char *name = 0);
private slots:
void newConnect_slot(CSocketClient *s);
signals:
void finished();
};
#endif
zmienneserwerclient
#ifndef CQTSERWERCLIENT_H
#define CQTSERWERCLIENT_H
#include <qfile.h>
#include <qvariant.h>
#include "../socket/socket.h"
class CQTSerwerClient : QObject
{
Q_OBJECT
public:
CQTSerwerClient(CSocketClient *client);
public slots:
void message_slot(const QVariant &msg);
void connectionClosed_slot();
private:
CSocketClient *m_pClient;
};
#endif