Russian Qt Forum

Qt => Работа с сетью => Тема начата: Zizilk от Июль 22, 2010, 12:35



Название: QT и тср сервер
Отправлено: Zizilk от Июль 22, 2010, 12:35
Пытался разобраться сам с примером на QT fortune server.

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

Как я понимаю нужно писать цикл, но вот вопрос какой :-[

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

И где можно посмотреть список сигналов?


Название: Re: QT и тср сервер
Отправлено: kuzulis от Июль 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 и запустите его.

Вот в кратце как оно всё работает :)


Название: Re: QT и тср сервер
Отправлено: Zizilk от Июль 22, 2010, 13:34
Спасибо за развёрнутый ответ) книжки обязательно почитаю)


Название: Re: QT и тср сервер
Отправлено: Zizilk от Июль 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


Название: Re: QT и тср сервер
Отправлено: SimpleSunny от Июль 24, 2010, 00:17
SLOT должен быть функцией класа.


Название: Re: QT и тср сервер
Отправлено: Sahab от Июль 24, 2010, 08:47

2Zizilk
connect это метод QObject
Код:
QObject::connect(...);


Название: Re: QT и тср сервер
Отправлено: Zizilk от Июль 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*)'


Название: Re: QT и тср сервер
Отправлено: SimpleSunny от Июль 24, 2010, 21:22
СРочно читать про программирование с использованием Qt.

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

Код
C++ (Qt)
class mainserver
{
Q_OBJECT
 
private:
   QTcpServer *tcpServer;
public:
   mainserver();
 
private slots:
   void newuser();
};


Название: Re: QT и тср сервер
Отправлено: Zizilk от Июль 24, 2010, 21:48
Да я заметил(

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

Всё та же самая фиговина.
+в объявлении класса ругается на отсутсвие макроса, хотя он там есть Оо


Название: Re: QT и тср сервер
Отправлено: Zizilk от Июль 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 файле?


Название: Re: QT и тср сервер
Отправлено: SimpleSunny от Июль 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)
{
...
}
 


Название: Re: QT и тср сервер
Отправлено: Zizilk от Июль 24, 2010, 22:30
Да я понял)

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

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

Сейчас поставил в наследование Qobject моему классу, всё заработало). По крайней мере запустилось)


Название: Re: QT и тср сервер
Отправлено: Zizilk от Июль 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", а сообщения о новом подключении нет(следовательно не заходит в функцию, а значит не обрабатывает сигнал....)

Работаю в дебажном режиме