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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT и тср сервер  (Прочитано 9441 раз)
Zizilk
Гость
« : Июль 22, 2010, 12:35 »

Пытался разобраться сам с примером на QT fortune server.

По большей части разобрася. Не считая того как задать обработку новых сообщений от старых соединений.
Тк насколько я понял сам сервер реагирует только на новые подключения.

Как я понимаю нужно писать цикл, но вот вопрос какой Обеспокоенный

в программировании новичок, а в qt и подавно

И где можно посмотреть список сигналов?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Июль 22, 2010, 13:32 »

Всё просто.

Цитировать
По большей части разобрася. Не считая того как задать обработку новых сообщений от старых соединений.
Тк насколько я понял сам сервер реагирует только на новые подключения.

При новом подключении к серверу у сервера автоматически происходят следующие действия:
1. Объект сервера вызывает автоматически метод: void incomingConnection ( int socketDescriptor ) в котором socketDescriptor - это дескриптор сокета входящего подключения.
2. Объект сервера автоматически отправляет сигнал: void newConnection ()

Далее вы поступаете любым из следующих методов (как вам захочется):

1. Если вы хотите упор сделать на использование void incomingConnection ( int socketDescriptor )
то вы должны переопределить этот метод, написав в его теле нужный вам код, например:

Код:
void YuorServer::incomingConnection(int socketDescriptor)
{
    //1. Определяем новый объект - сокет
    QTcpSocket *socket = new QTcpSocket() ;

    //Пока что этот сокет "пустой/неинициализированный". Чтобы его инициадизировать - нужно установить в сокет дескриптор
    //входящего подключения.
    //2. Пытаемся   установить
    if (!socket->setSocketDescriptor(socketDescriptor))
        return;

    //3. Теперь можем производить операции I/O с этим сокетом. т.е. можем читать и писать в него/из него.
    // Все эти операции i/O с сокетом можно сколько угодно времени производить, пока клиент не отключится от сервера.
    // После отключения клиента необходимо уничтожить сокет.
}

2. Если упор на сигнал void newConnection () - то вам необходимо создать какой-нить слот с любым названием, типа: void slotProcNewConnection(). Предварительно нужно подключить сигнал, который испускает объект сервера к вашему слоту. А в теле слота написать так:

Код:
void YuorServer::slotProcNewConnection() 
{
    QTcpSocket *socket = nextPendingConnection ();

    //в этом случае сокет инициализировать не нужно, т.к. метод nextPendingConnection () вернет уже инициализированный объект.
    //Теперь с сокетом можно работать, т.е производить операции I/O и т.п.
}

Цитировать
Как я понимаю нужно писать цикл, но вот вопрос какой Обеспокоенный
Не нужно никаких циклов

Цитировать
в программировании новичок, а в qt и подавно
почитайте книжки по Qt4 для начала типа М. Шлее или Ж. Бланшет. Для начала. Литература имеется и на этом форуме в разделе "Общие вопросы" и на форуме: crossplatform.ru


Цитировать
И где можно посмотреть список сигналов?
Найдите в той директории куда установлен у вас Qt4 екзешник: assistant.exe и запустите его.

Вот в кратце как оно всё работает Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Zizilk
Гость
« Ответ #2 : Июль 22, 2010, 13:34 »

Спасибо за развёрнутый ответ) книжки обязательно почитаю)
Записан
Zizilk
Гость
« Ответ #3 : Июль 23, 2010, 23:46 »

Получалось заставить слушать его, но возникла проблемма с connect функцией.

Код:
#include <QtCore/QCoreApplication>
#include <stdlib.h>
#include <stdio.h>
#include <QtNetwork>

void newuser()
{
    printf("New connection");
}

int main(int argc, char *argv[])
{
    QTcpServer *tcpServer;
    QCoreApplication a(argc, argv);
    tcpServer = new QTcpServer();
    if (!tcpServer->listen(QHostAddress::Any,5423)) {
        printf("Ошибка сервера. ");
        return 0;
    }

    printf("The server is running");
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newuser()));
    return a.exec();
}


При попытки использовать её выводит ошибки
Код:
C:/Qt/2010.04/qt/Test_orion_server-build-desktop/../Test_orion_server/main.cpp:22: error: invalid use of 'this' in non-member function

C:/Qt/2010.04/qt/Test_orion_server-build-desktop/../Test_orion_server/main.cpp:22: error: 'connect' was not declared in this scope
Записан
SimpleSunny
Гость
« Ответ #4 : Июль 24, 2010, 00:17 »

SLOT должен быть функцией класа.
Записан
Sahab
Гость
« Ответ #5 : Июль 24, 2010, 08:47 »


2Zizilk
connect это метод QObject
Код:
QObject::connect(...);
Записан
Zizilk
Гость
« Ответ #6 : Июль 24, 2010, 19:18 »

Написал класс соответсвующий с this ошибка исчезла появилась новая и новая ошибка
Код:
#include <QtCore/QCoreApplication>
#include <stdlib.h>
#include <stdio.h>
#include <QtNetwork>
class mainserver
{
private:
    QTcpServer *tcpServer;
public:
    mainserver();

private:
    void newuser();
};

mainserver::mainserver()
{
    tcpServer = new QTcpServer();
    if (!tcpServer->listen(QHostAddress::Any,5423)) {
        printf("Ошибка сервера. ");
}

    printf("The server is running");
    QObject::connect(tcpServer, SIGNAL(newConnection()),this,SLOT(newuser()));
}
void mainserver::newuser()
    {
        printf("New connection");
    }
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    mainserver();
    return a.exec();
}

ошибка
Код:
C:/Qt/2010.04/qt/Test_orion_server-build-desktop/../Test_orion_server/main.cpp:24: error: no matching function for call to 'QObject::connect(QTcpServer*&, const char*, mainserver* const, const char*)'
Записан
SimpleSunny
Гость
« Ответ #7 : Июль 24, 2010, 21:22 »

СРочно читать про программирование с использованием Qt.

По теме.
Забыли указать SLOT и макрос Q_OBJECT

Код
C++ (Qt)
class mainserver
{
Q_OBJECT
 
private:
   QTcpServer *tcpServer;
public:
   mainserver();
 
private slots:
   void newuser();
};
Записан
Zizilk
Гость
« Ответ #8 : Июль 24, 2010, 21:48 »

Да я заметил(

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

Всё та же самая фиговина.
+в объявлении класса ругается на отсутсвие макроса, хотя он там есть Оо
Записан
Zizilk
Гость
« Ответ #9 : Июль 24, 2010, 22:19 »

Код:
#ifndef SERVER_H
#define SERVER_H


class QTcpServer;


class Server
{
Q_OBJECT
public:
    Server();

private slots:
    void newuser();

private:
    QTcpServer *tcpServer;
};
newuser подчёркивает жёлтым и пишет, что нет Q_OBJECT, хотя он явно есть


Для макросов надо что-то ещё прописывать в pro файле?
Записан
SimpleSunny
Гость
« Ответ #10 : Июль 24, 2010, 22:27 »

Еще надо унаследоваться от QObject

Код
C++ (Qt)
class Server : public QObject
{
Q_OBJECT
public:
   Server(QObject *parent = 0);
 
private slots:
   void newuser();
 
private:
   QTcpServer *tcpServer;
};
 
Server(QObject *parent):QObject(parent)
{
...
}
 
Записан
Zizilk
Гость
« Ответ #11 : Июль 24, 2010, 22:30 »

Да я понял)

только что набирал) когда ответили) спасибо)
Цитировать
Всё разобрался  Веселый

Поскольку приложение консольное то везде поудалял наследования от диалога(которые достались от сервера предсказаний, и который наследовал от QObject)

Сейчас поставил в наследование Qobject моему классу, всё заработало). По крайней мере запустилось)
Записан
Zizilk
Гость
« Ответ #12 : Июль 26, 2010, 17:46 »

Имею такой код

Код:
#include <QtNetwork>
#include <QTcpSocket>
#include <stdlib.h>
#include <stdio.h>
#include "server.h"

Server::Server()
{
    tcpServer = new QTcpServer();
    if (!tcpServer->listen(QHostAddress::Any,5423)) {
        printf("Server isn't works fine( \n");

    }
    else {
        printf("Server works fine) \n");
    }
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newuser()));
}

void Server::newuser()
{
    QTcpSocket * Clientsocket=tcpServer->nextPendingConnection();
    connect(Clientsocket,SIGNAL(disconnected()),Clientsocket,SLOT(deleteLater()));
    Clientsocket->write("Hi");
    printf("New user \n");
}

На php написал клиент, который конектится к хосту.
Клиент проверял, без запущенного сервера пишет, что не может подключится.
С запущенным сервером(до того как ему сказал, читать сокет) подключался(по крайней мере если верить php клиенту.)

Интересно другое, несмотря на то, что как бы NewConnection у меня связан с функцией коннектом.
Она почему-то не вызывается. Те вижу надпись "server works fine", а сообщения о новом подключении нет(следовательно не заходит в функцию, а значит не обрабатывает сигнал....)

Работаю в дебажном режиме
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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