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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Сервер, обслуживающий два клиента, но без QThread  (Прочитано 16714 раз)
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #15 : Февраль 21, 2010, 03:02 »

Чтобы сервер разобрался с 25 клиентами у каждого клиента должен быть ID, а слушать можно 1 порт. Тогда если изменения пришли с клиента с ID=5 передать это изменение всем клиентам кроме того у которого ID=5. Изменения сервера передаются всем. Это все конечно если хочется поддержать одну и ту же структуру на клиенте и сервере...

ID клиента должен генерить сервер при подключении клиента - они только на сервере и хранятся...
Записан
G-virus
Гость
« Ответ #16 : Февраль 21, 2010, 13:09 »

Хм.  Строит глазки
Тогда можно сделать, как ты и пробовал.
Сервер открывает два порта (например 6177 и 6178). Все кто подключаются к первому порту - отправляют данные (Sender), все кто подключаются ко второму - получают результат (Recv).

Воспользовался советом. Спасибо. Работает Улыбающийся

Что-то судари вы заморачиваетесь. Посмотрите внимательно Fortune Client & Fortune Server в демках. там даже не создается новый класс наследуемый от QTcpSocket, все можно сделать стандартный сервер. смотрим например так.

Этот способ мне тоже понравился... но у меня почему-то программа аварийно завершается. Перерыл эти примеры fortuneClient и fortuneServer. Сделать так же, может что-то упустил. Как подсказал BRE конечно все работает, но пришлось делать два класса Sender и Reciever наследуемых от QtcpServer и открывать два порта. А тут и кода и меньше и работает один порт, но прога аварийно завершается, хгтя компилятор ничего не сообщает. Идет возврат кода -1073741795.
Вот код widget.h:
Код
C++ (Qt)
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QtGui/QWidget>
#include <QTcpServer>
#include <QTcpSocket>
 
class QTcpServer;
 
class Server : public QWidget
{
   Q_OBJECT
public:
   Server(QWidget *parent = 0);
   int i;
   QTcpSocket *socket1, *socket2;
   QString strA, buf;
public slots:
  void readPack();
  void readClient();
protected:
   void incomingConnection();
};
#endif // WIDGET_H
 
widget.cpp:
Код
C++ (Qt)
#include "widget.h"
#include <QMessageBox>
QTcpServer *server = new QTcpServer;
 
Server::Server(QWidget *parent)
   :QWidget(parent)
{
   connect(socket1, SIGNAL(readyRead()), this, SLOT(readPack()));
   connect(socket2, SIGNAL(readyRead()), this, SLOT(readClient()));
   i = 0;
   server->setParent(this);
   if (!server->listen(QHostAddress::Any, 6178))
   {
       QMessageBox::critical(NULL, "Error", "Невозможно открыть порт 6178");
       server->close();
       return;
   }
}
 
void Server::incomingConnection()
{
    ++i;
    if (i == 2)
    {
        socket1 = server->nextPendingConnection();
        socket2 = server->nextPendingConnection();
    }
}
void Server::readClient()
{
    QDataStream in(socket2);
    QDataStream out(socket1);
    in >> strA;
    if (strA == "Hello")
        buf = "Yeah";
    else
        buf = "Nothing";
    out << buf;
}
void Server::readPack()
{
    QDataStream in(socket1);
    QDataStream out(socket2);
    in >> strA;
    out << strA;
}
 
 
main.cpp:
Код
C++ (Qt)
#include <QTextCodec>
#include <QtGui/QApplication>
#include "widget.h"
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QTextCodec *codec = QTextCodec::codecForName("cp1251");
   QTextCodec::setCodecForLocale(codec);
   QTextCodec::setCodecForTr(codec);
   QTextCodec::setCodecForCStrings(codec);
       Server tcpServer;
       tcpServer.setGeometry(0, 0, 0, 0);
       tcpServer.show();;
return a.exec();
}
 

Ткните пальцем в ошибку пожалуйста  Смеющийся
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #17 : Февраль 21, 2010, 13:41 »

Ты в конструкторе пытаешься коннектить еще не созданные объекты socket1 и socket 2

Стоит пользоваться отладчиком

так работает - точнее не знаю что там работает - программа запускается и не падает...
Код
C++ (Qt)
Server::Server(QWidget *parent)
:QWidget(parent)
{
///////////////////////////////////////////////////////////////////////
socket1 = new QTcpSocket();
socket2 = new QTcpSocket();
///////////////////////////////////////////////////////////////////////
 
connect(socket1, SIGNAL(readyRead()), this, SLOT(readPack()));
connect(socket2, SIGNAL(readyRead()), this, SLOT(readClient()));
i = 0;
server->setParent(this);
if (!server->listen(QHostAddress::Any, 6178))
{
QMessageBox::critical(NULL, "Error", "Невозможно открыть порт 6178");
server->close();
return;
}
}
« Последнее редактирование: Февраль 21, 2010, 13:44 от break » Записан
G-virus
Гость
« Ответ #18 : Февраль 21, 2010, 14:11 »

Ты в конструкторе пытаешься коннектить еще не созданные объекты socket1 и socket 2

Пасибо  Улыбающийся Терь буду правильно устанавливать контакт...

Всем спасибо!
Записан
G-virus
Гость
« Ответ #19 : Февраль 21, 2010, 18:18 »

Вот я немного изменил, но почему-то пакеты не доходят. Подскажите что забыл добавить?
main.cpp
Код
C++ (Qt)
#include <QTextCodec>
#include <QtGui/QApplication>
#include "widget.h"
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QTextCodec *codec = QTextCodec::codecForName("cp1251");
   QTextCodec::setCodecForLocale(codec);
   QTextCodec::setCodecForTr(codec);
   QTextCodec::setCodecForCStrings(codec);
       Server tcpServer;
       tcpServer.setGeometry(0, 0, 0, 0);
       tcpServer.show();;
return a.exec();
}
 

widget.h
Код
C++ (Qt)
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QtGui/QWidget>
#include <QTcpServer>
#include <QTcpSocket>
 
class QTcpServer;
 
class Server : public QWidget
{
   Q_OBJECT
public:
   Server(QWidget *parent = 0);
   int i;
   QString strA;
   QTcpSocket *socket1, *socket2;
public slots:
  void readPack();
  void readClient();
protected:
   void incomingConnection();
};
#endif // WIDGET_H
 

widget.cpp
Код
C++ (Qt)
#include "widget.h"
#include <QMessageBox>
QTcpServer *server = new QTcpServer;
Server::Server(QWidget *parent)
   :QWidget(parent)
{
   socket1 = new QTcpSocket();
   socket2 = new QTcpSocket();
   connect(socket1, SIGNAL(readyRead()), this, SLOT(readPack()));
   connect(socket2, SIGNAL(readyRead()), this, SLOT(readClient()));
   connect(socket1, SIGNAL(disconnected()), this, SLOT(deleteLater()));
   connect(socket2, SIGNAL(disconnected()), this, SLOT(deleteLater()));
   i = 0;
   server->setParent(this);
   if (!server->listen(QHostAddress::Any, 6178))
   {
       QMessageBox::critical(NULL, "Error", "Невозможно открыть порт 6178");
       server->close();
       return;
   }
}
 
void Server::incomingConnection()
{
    ++i;
    if (i == 2)
    {
        socket1 = server->nextPendingConnection();
        socket2 = server->nextPendingConnection();
    }
}
 
void Server::readClient()
{
    QDataStream in(socket2);
    QDataStream out(socket1);
    in.setVersion(QDataStream::Qt_4_6);
    in >> strA;;
    out << strA;
}
 
void Server::readPack()
{
    QDataStream recv(socket1);
    QDataStream send(socket2);
    recv.setVersion(QDataStream::Qt_4_6);
    recv >> strA;
    send << strA;
}
 
 
« Последнее редактирование: Февраль 23, 2010, 12:49 от G-virus » Записан
SABROG
Гость
« Ответ #20 : Февраль 23, 2010, 18:48 »

Код
C++ (Qt)
   connect(socket1, SIGNAL(readyRead()), this, SLOT(readPack()));
   connect(socket2, SIGNAL(readyRead()), this, SLOT(readClient()));
 

Вероятно потому, что readyRead() никогда не приходит, так как ни одному из сокетов не хватает смелости завести разговор (отправить данные).
Записан
G-virus
Гость
« Ответ #21 : Февраль 23, 2010, 20:57 »

Код
C++ (Qt)
   connect(socket1, SIGNAL(readyRead()), this, SLOT(readPack()));
   connect(socket2, SIGNAL(readyRead()), this, SLOT(readClient()));
 
Вероятно потому, что readyRead() никогда не приходит, так как ни одному из сокетов не хватает смелости завести разговор (отправить данные).

Почему не приходит? Я с клиента посылаю данные на socket2. Значит должен сработать readClient(), и отправиться строка на socket1. Там (на другом уже клиенте) обрабатывается и посылается ответ. Этот ответ приходит на socket1 readPack() и посылается на socket2 (моему первоначальному клиенту).

 Непонимающий
« Последнее редактирование: Февраль 23, 2010, 23:19 от G-virus » Записан
SABROG
Гость
« Ответ #22 : Февраль 24, 2010, 03:13 »

Чего-то у тебя incomingConnection() нигде не коннектится,  даже слотом не является, непонятно как ты подключения новые обрабатываешь.
Записан
G-virus
Гость
« Ответ #23 : Февраль 24, 2010, 11:35 »

Чего-то у тебя incomingConnection() нигде не коннектится,  даже слотом не является, непонятно как ты подключения новые обрабатываешь.

Хм... protected: void incomingConnection()  Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #24 : Февраль 24, 2010, 12:46 »

G-virus , что сие вообще значит???

1.
Код:
...
class Server : public QWidget
....
...

2.
Код:
...
QTcpServer *server = new QTcpServer;
Server::Server(QWidget *parent)
    :QWidget(parent)
...
...

o_O ...  что за бредятина (ИМХО) ?

Цитировать
Хм... protected: void incomingConnection()  Улыбающийся

и что толку от этого? а? с чего вдруг твой ВИДЖЕТ Server будет обрабатывать:  void Server::incomingConnection() ?
« Последнее редактирование: Февраль 24, 2010, 13:03 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
G-virus
Гость
« Ответ #25 : Февраль 24, 2010, 13:24 »

Возможно я не так понял. Но мне предлагали такой вариант. и в fortuneServer и fortuneClient что-то похожее.

Я сделал наследование от QTcpServer и немного изменил код. Но теперь у меня не получается получить доступ к объекту Server, чтобы выполнить манипуляции в incomingConnection().
« Последнее редактирование: Февраль 24, 2010, 13:36 от G-virus » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #26 : Февраль 24, 2010, 13:36 »

G-virus ,

Повнимательнее разбери примеры: fortuneserver, threadedfortuneserver и т.п.
и  сравни с тем как сделано у тебя! Найди отличия! Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
G-virus
Гость
« Ответ #27 : Февраль 24, 2010, 13:37 »

Дело в том, что отличий куча  Смеющийся вообще не похоже как у меня. Я конечно могу скопировать и использовать fortuneServer или threadedfortuneServer, но хотелось бы свой серв довести до ума.
« Последнее редактирование: Февраль 24, 2010, 23:45 от G-virus » Записан
G-virus
Гость
« Ответ #28 : Февраль 28, 2010, 18:39 »

Короче ни черта я не понял всякие fortuneClient и fortuneServer (threadedfortuneServer)  Смеющийся Воспользовался советом BRE
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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