Russian Qt Forum
Ноябрь 23, 2024, 18:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Помогите с сервером....  (Прочитано 17803 раз)
fuCtor
Гость
« Ответ #15 : Февраль 24, 2012, 16:23 »

А может посмотреть на существующие решения в плане организации межпроцессного общения и соответствующим протоколам?
Либо сервер должен в само приложения встраиваться наряду с клиентом?
Можно ссылки по этому поводу пожалуйста...?

Не совсем понял вопрос. Клиент отдельно, сервер отдельно. Сервер принимает данные от какой-нибудь клиента и отсылает их всем клиентам. То есть он нужен чтобы разослать данные от каждого клиента каждому клиенту, т.е. для взаимодействия клиентов каждый с каждым.

Если сервер отдельно, то гораздо проще. На вскидку:
  • protobuf
  • CORBA (тот еще монстр конечно)
  • Thrift
  • AMQP и один из серверов его поддерживающих (RabbitMQ, QPID, ZeroMQ)
ИМХО рекомендовал бы присмотреться к последнему варианту, производительность у этого решения более чем достаточная, позволяет очень гибкие схемы обмена данными делать. Есть обертки для интеграции в Qt окружение для некоторых из них.

Пример описывающие идеологию AMQP можно посмотреть тут: http://www.rabbitmq.com/getstarted.html и тут http://www.rabbitmq.com/tutorials/amqp-concepts.html
« Последнее редактирование: Февраль 24, 2012, 16:26 от fuCtor » Записан
lolbla2
Гость
« Ответ #16 : Февраль 24, 2012, 16:24 »

Ну например можно мувнуть сокет в нужный тред. Или создать его прям в нужном треде

ну и еще - тред у тебя не умрет никогда, а на каждую новую порцию данных будет создан новый

Имеешь в виду для каждого сокета отдельный поток что ли? Типо сокет подключился, создали для него поток... Я то хотел один поток для передачи всем сокетам (клиентам), поэтому в поток передаю список клиентов.  Кстати почему-то лист клиентов нельзя мувнуть в поток... почему? Чот я до конца не пойму, это получается поток может использовать только объекты созданные внутри него или как ?

что значит "мувнуть лист клиентов"?
нет, поток может и другие объекты использовать, но родитель объекта и сам объект должны находиться в одном и том же потоке

вот это  QList <QTcpSocket *> clients как moveToThread сделать? по одному только что ли мувать?

чот блин с такими ограничению по использованию объектов мне даже пока норм идей не пришло как сделать чтобы  можно было получать от всех клиентов данные и отправлять всем клиентам данные в отдельном потоке, ну или хотя бы только отправлять в отдельном потоке а получать в главном
Записан
mutineer
Гость
« Ответ #17 : Февраль 24, 2012, 16:30 »

да, только по одному.
Вот тебе идея - создаешь объект, умеющий работать с сокетами. создаешь тред. муваешь этот объект в тред. в методе void MyServer::incomingConnection(int socketDescriptor) сигналом передаешь этому объекту socketDescriptor. Объект принимает дескриптор и создает для него сокет. А дальше объект вычитывает данные из сокетов, и отправляет через них же ответы клиентам
Записан
lolbla2
Гость
« Ответ #18 : Февраль 24, 2012, 17:44 »

да, только по одному.
Вот тебе идея - создаешь объект, умеющий работать с сокетами. создаешь тред. муваешь этот объект в тред. в методе void MyServer::incomingConnection(int socketDescriptor) сигналом передаешь этому объекту socketDescriptor. Объект принимает дескриптор и создает для него сокет. А дальше объект вычитывает данные из сокетов, и отправляет через них же ответы клиентам

объект, умеющий работать с сокетами - сервер что ли, тобишь объект от него наследованный?
Записан
mutineer
Гость
« Ответ #19 : Февраль 24, 2012, 17:48 »

объект, умеющий работать с сокетами - сервер что ли, тобишь объект от него наследованный?

Нет, просто наследник QObject с нужными методами и слотами (для приема данных от сокета, для отправки данных через сокет)
Записан
lolbla2
Гость
« Ответ #20 : Февраль 24, 2012, 19:06 »

объект, умеющий работать с сокетами - сервер что ли, тобишь объект от него наследованный?

Нет, просто наследник QObject с нужными методами и слотами (для приема данных от сокета, для отправки данных через сокет)

Извини за тугодумство  Смеющийся, но чот я не догнал зачем QObject здесь? можно насчёт этого попдробнее с примерчиком кода?)_)
Записан
mutineer
Гость
« Ответ #21 : Февраль 24, 2012, 19:35 »

QObject тут для того, чтобы у объекта были сигналы и слоты. Иначе как с ним общаться из другого треда?
Записан
lolbla2
Гость
« Ответ #22 : Февраль 24, 2012, 19:36 »

QObject тут для того, чтобы у объекта были сигналы и слоты. Иначе как с ним общаться из другого треда?

ну сокет же сам как объект, да и тред тоже объект
Записан
mutineer
Гость
« Ответ #23 : Февраль 24, 2012, 19:37 »

QObject тут для того, чтобы у объекта были сигналы и слоты. Иначе как с ним общаться из другого треда?

ну сокет же сам как объект, да и тред тоже объект

Блин, ну не нравится - делай по-своему, я же не заставляю
Записан
lolbla2
Гость
« Ответ #24 : Февраль 24, 2012, 20:17 »

QObject тут для того, чтобы у объекта были сигналы и слоты. Иначе как с ним общаться из другого треда?

ну сокет же сам как объект, да и тред тоже объект

Блин, ну не нравится - делай по-своему, я же не заставляю

я просто примерчик прошу чтобы понятнее было
Записан
mutineer
Гость
« Ответ #25 : Февраль 25, 2012, 13:20 »

Код
C++ (Qt)
class Replyer: public QObject
{
Q_OBJECT
public:
Replyer(QObject *parent = 0) :QObject(parent) {}
 
private:
QList<QTcpSocket*> mClients;
void reply(QString message);
 
public slots:
void newConnection(int descriptor);
 
private slots:
void readData();
};
 
void Replyer::newConnection(int descriptor)
{
QTcpSocket *client = new QTcpSocket(this);
if(client->setSocketDescriptor(descriptor))
{
connect(client, SIGNAL(readyRead()), SLOT(readData()));
mClients.append(client);
}
else
{
client->deleteLater();
}
}
 
void Replyer::readData()
{
QTcpSocket *client = qobject_cast<QTcpSocket*>(sender());
if(client)
{
//read data from socket
reply(...);
}
}
 
void Replyer::reply(QString message)
{
foreach(QTcpSocket* client, mClients)
{
//send data to clients
}
}

вот приблизительно так я вижу класс, который будет жить в потоке. Удаление сокетов при отключении добавь по вкусу))

Писал не компилируя, могуть быть синтаксические ошибки
Записан
lolbla2
Гость
« Ответ #26 : Февраль 25, 2012, 15:06 »

Код
C++ (Qt)
class Replyer: public QObject
{
Q_OBJECT
public:
Replyer(QObject *parent = 0) :QObject(parent) {}
 
private:
QList<QTcpSocket*> mClients;
void reply(QString message);
 
public slots:
void newConnection(int descriptor);
 
private slots:
void readData();
};
 
void Replyer::newConnection(int descriptor)
{
QTcpSocket *client = new QTcpSocket(this);
if(client->setSocketDescriptor(descriptor))
{
connect(client, SIGNAL(readyRead()), SLOT(readData()));
mClients.append(client);
}
else
{
client->deleteLater();
}
}
 
void Replyer::readData()
{
QTcpSocket *client = qobject_cast<QTcpSocket*>(sender());
if(client)
{
//read data from socket
reply(...);
}
}
 
void Replyer::reply(QString message)
{
foreach(QTcpSocket* client, mClients)
{
//send data to clients
}
}

вот приблизительно так я вижу класс, который будет жить в потоке. Удаление сокетов при отключении добавь по вкусу))

Писал не компилируя, могуть быть синтаксические ошибки

А как теперь с потоком связать это?
Я думаю так может: В класс потока добавить этот объект Replyer.  В классе сервера на incomingConnection добавить в поток в объект Replyer подключившийся сокет, передав ему дескриптор сокета. Но тогда что должно выполняться в потоке в методе run ?
Записан
mutineer
Гость
« Ответ #27 : Февраль 25, 2012, 15:43 »

QThread *thread = new QThread(this);
Replyer *repl = new Replyer();
repl->moveToThread(thread);
thread->run();

и кончено же к newConnection(int descriptor) надо прявязываться без Qt::DirectConnection
Записан
lolbla2
Гость
« Ответ #28 : Февраль 25, 2012, 16:55 »

QThread *thread = new QThread(this);
Replyer *repl = new Replyer();
repl->moveToThread(thread);
thread->run();

и кончено же к newConnection(int descriptor) надо прявязываться без Qt::DirectConnection

Спасибо, а что в методе run в потоке делать?
Записан
mutineer
Гость
« Ответ #29 : Февраль 25, 2012, 17:02 »

Спасибо, а что в методе run в потоке делать?

ничего. не перегружай поток, а используй стандартный QThread
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.154 секунд. Запросов: 21.