crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Получение данных на сервере?
V7T
  опции профиля:
сообщение 21.10.2011, 16:08
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 11.10.2011
Пользователь №: 2939

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте, пишу клиент/серверное приложение, я использую FortuneClient и ThreadedFortuneServer из SDK QT.

Все бы ничего, но ни как не могу понять (это первое мое приложение в QT и собственно в линуксе), принцип получения данных на сервере.
В самих примерах все достаточно просто, но там данные отправляются клиенту, который их принимает, перед этим отправив запрос.

Собственно вот часть кода клиента:
void Client::requestNewFortune()
{
    //getFortuneButton->setEnabled(false);
    blockSize = 0;
    tcpSocket->abort();

    tcpSocket->connectToHost(hostLineEdit->text(),
                             portLineEdit->text().toInt());

    QPixmap screenshot = QPixmap::grabWindow(QApplication::desktop()->winId());
    QByteArray foto;
    QBuffer buffer(&foto);
    buffer.open(QIODevice::WriteOnly);
    screenshot.save(&buffer,"jpg");

    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out<<buffer.data();//отправяем данные скриншота
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));

    qDebug()<<"Size of buffer: "<<buffer.size();//число...
    qDebug()<<"Size of block: "<<block.size();//число...
    
    qDebug()<< tcpSocket->write(block);

    tcpSocket->disconnectFromHost();
    tcpSocket->waitForDisconnected();



часть кода сервера:
void FortuneThread::run()
{
    QTcpSocket tcpSocket;
    if (!tcpSocket.setSocketDescriptor(socketDescriptor))//работаем с дескриптором
    {
        emit error(tcpSocket.error());
        return;
    }


    QDataStream in(&tcpSocket);//здесь без взятия адреса ругается
    in.setVersion(QDataStream::Qt_4_0);

    QByteArray buffer;
    in >> buffer;

    qDebug()<<buffer.size();
    qDebug()<<tcpSocket.bytesAvailable();

    tcpSocket.disconnectFromHost();
    //tcpSocket.waitForDisconnected();
}


В коде сервера явно не все впорядке (возможно и клиенте) :) , и Вас уважаемые гуру наверно :bad: .

Правильно ли данные отправляются?
Может стоит создать connect(сокет,сигнал(readyRead()),...,slot(..)), впринципе, что я только не делал, все одно - ничего)).
Не первый день пытаюсь разобраться, окончательно запутался.

Подскажите, пожалуйста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
V7T
  опции профиля:
сообщение 23.10.2011, 13:39
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 11.10.2011
Пользователь №: 2939

Спасибо сказали: 0 раз(а)




Репутация:   0  


Silver, спасибо за отзыв.

Я в принципе сам не много разобрался с получением данных на сервере, но пока без многопоточной реализации. Решил ее пока не трогать. Теперь появилась другая проблема, я написал небольшой класс для клиента, вызываю его в Main и все работает на ура (скриншот отправляется и принимается на сервере), но стоит в классе, который работает с формой (MainWindow.cpp) загнать тот же код, что и в Main, в обработчик события кнопки, как ни какой отправки не наблюдается, но соединение происходит и сервер его отлавливает (если в дебагер вывести содержимое сокета, то будет по нулям). Еще заметил, что если в Main несколько раз запустить один и тот же кусок кода, то первое соединение работает, а последующие нет (соединение происходит, но ни чего не отправляется). Причем, если через консоль запустить несколько экземпляров программы, то все работает, т.е. сервер не причем

Вот привожу код клиента:
/////MAIN.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    QPixmap pixmap=QPixmap::grabWindow(QApplication::desktop()->winId());

    QDateTime time=QDateTime::currentDateTime();
    QString StringTime = time.toString("dd.MM.yyyy hh:mm:ss");

    QString address ="127.0.0.1";
    int port = 7777;

    SendImage s(address, port);
    // To send an image give the image and the image name
    s.send(pixmap.toImage(), StringTime+".png");

    return a.exec();
}


/////////MainWindow.cpp
#include <mainwindow.h>
#include <ui_mainwindow.h>
#include <sendimage.h>
#include <QtGui>

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::doSendImage()
{
    QDateTime time=QDateTime::currentDateTime();
    QString StringTime = time.toString("dd.MM.yyyy hh:mm:ss");

    QPixmap pixmap=QPixmap::grabWindow(QApplication::desktop()->winId());

    QString address = ui->hostLineEdit->text();
    int port = ui->portLineEdit->text().toInt();

//.............................................
//вызываю экземпляр
    SendImage s(address, port);
    // To send an image give the image and the image name
    s.send(pixmap.toImage(), StringTime+".png");
//.............................................
}

void MainWindow::on_startSendImage_clicked()
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(doSendImage()));
    timer->start(5000);
}

void MainWindow::on_stopSendImage_clicked()
{
    //global timer...
    //timer->stop..
}


[b]/////////Как работает класс[/b]
SendImage::SendImage(QString address, int port)
{
    this->address = address;
    this->port = port;

    socket = new QTcpSocket(this);

    connect(socket, SIGNAL(connected()), SLOT(setConnected()));
}

void SendImage::setConnected()
{
        reallySend(this->name, this->image);
}

void SendImage::send(QImage image, QString name)
{
    // Store the data
    this->name = name;
    this->image = image;
    // Start connection
    toggleConnection();
}

void SendImage::reallySend(QString name, /*QPixmap*/QImage image)
{
        if(socket->state() == QAbstractSocket::ConnectedState)
        {
            image.setText("name", name);
            QByteArray ba;
            QBuffer buffer(&ba);
            image.save(&buffer, "PNG");

            QByteArray block;
            QDataStream out(&block, QIODevice::WriteOnly);
            out.setVersion(QDataStream::Qt_4_0);
            out << (quint16)0;
            out << ba;
            out.device()->seek(0);
            out << (quint16)(block.size() - sizeof(quint16));

            socket->write(block);
            qDebug()<<"Size buffer:"<<block.size();
            qDebug()<<"Real Size Screen:"<<ba.size();
        }
        else
        {
            qDebug("Image has not been send. No connection established!");
        }
        toggleConnection();
}

void SendImage::toggleConnection()
{
        if (socket->state() == QAbstractSocket::UnconnectedState)
        {
            socket->connectToHost(this->address, this->port, QIODevice::WriteOnly);
        }
        else
        {
            socket->disconnectFromHost();
        }
}


[b]//////Код класса[/b]
class SendImage : public QObject
{
        Q_OBJECT

public:
        SendImage(QString address, int port);
        void send(QImage image, QString name);

private slots:
        void setConnected();

private:
        void toggleConnection();
        void reallySend(QString name, QImage image);

public:
        QString name;
        QImage image;
        QString    address;
        int port;
        QTcpSocket* socket;
};


Код сервера
///Собственно обработка на сервере, мало ли, может я что-то делаю не так

ImageServer::ImageServer(QObject* parent) : QTcpServer(parent)
{
    connect(this, SIGNAL(newConnection()), this, SLOT(addConnection()));
}

void ImageServer::addConnection()
{
    qDebug("Adding connection");
    QTcpSocket* connection = nextPendingConnection();
    //connections in imageserver.h (QList<QTcpSocket>)
    connections.append(connection);
    connect(connection, SIGNAL(disconnected()), SLOT(removeConnection()));
}

void ImageServer::removeConnection()
{
    receiveImage();
    QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
    connections.removeAll(socket);
    socket->deleteLater();
}

void ImageServer::receiveImage()
{
    QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
    quint16 blockSize=0;

    QDataStream in(socket);
    in.setVersion(QDataStream::Qt_4_0);

    //qDebug()<<socket->size();
    //qDebug()<<socket->bytesAvailable();
    if (blockSize == 0)
    {
        if (socket->bytesAvailable() < (int)sizeof(quint16))
        {
            return;
        }
        in >> blockSize;
    }
    if (socket->bytesAvailable() < blockSize)
    {
        return;
    }

    QByteArray Block;
    in >> Block;
    //qDebug()<<socket->size();
    //qDebug()<<socket->bytesAvailable();

    qDebug()<<blockSize;
    qDebug()<<Block.size();

    QImage image;
    image.loadFromData(Block,"PNG");
    QString filename = image.text("name");
    image.save(QString(getenv("HOME"))+"/Screenshot/"+filename,"PNG",100);

}


Что не так, подскажите
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 13.11.2024, 1:02