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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Передача файлов через QTcpSocket без gui  (Прочитано 9894 раз)
qtest
Гость
« : Май 02, 2013, 12:21 »

Здравствуйте. Для курсовой очень нужна наиболее простая программа для отправки/принятия небольшого текстового файла (примерно до 20 символов).
Что-то такое, но нужен полностью консольный вариант, без gui. В поиске и в гугле, вроде бы, ничего. Странно вообще, что нигде нет самого простого варианта.
Записан
Bepec
Гость
« Ответ #1 : Май 02, 2013, 17:46 »

Не ищи ты в гугле не ищи...

Fortune server/client вам в помощь из примеров.
Записан
qtest
Гость
« Ответ #2 : Май 03, 2013, 18:17 »

В нем разобрался, но там тоже гуи, попытался переделать в консольный вариант:
Код:
#include <QCoreApplication>
#include <iostream>
#include <qnetwork.h>
#include <QTcpSocket>
#include <QtNetwork>
using namespace std;

QTcpSocket *tcpSocket;
qint16 port;
qint16 blockSize;
QString currentFortune;


void requestNewFortune()
{
    blockSize = 0;
    tcpSocket->abort();
    tcpSocket->connectToHost(QHostAddress::LocalHost,port);;
}

void readFortune()
{

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

    if (blockSize == 0) {
        if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
            return;

        in >> blockSize;
    }

    if (tcpSocket->bytesAvailable() < blockSize)
        return;


    QString nextFortune;
    in >> nextFortune;
  /*  if (nextFortune == currentFortune) {
        QTimer::singleShot(0, this, SLOT(requestNewFortune()));
        return;
    }
 */
    currentFortune = nextFortune;
    currentFortune="test";
  //  statusLabel->setText(currentFortune);
  //  getFortuneButton->setEnabled(true);
}




int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    currentFortune="Nothing";
    cin>>port;
    tcpSocket = new QTcpSocket();
    requestNewFortune();
    readFortune();
    cout<<currentFortune.toStdString()<<endl;
    return app.exec();
}
Почему-то не работает, судя по тестам - даже не коннектится к серверу(он точно работает, не переписанный из примера), проблема, видимо, в передаче порта. Как это можно исправить?
Записан
Bepec
Гость
« Ответ #3 : Май 03, 2013, 18:26 »

Йоптель моптель. Чтож за день сеня такой. Ещё один ничего не понимающий  в сигналах и слотах. Вы не даёте своему слоту принять информацию Веселый
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Май 03, 2013, 18:56 »

ГыГы
Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #5 : Май 03, 2013, 21:14 »

Уточню, ведь опять посыпятся вопросы. Вы послали пакет за пивом сообщением. Он не успел ещё с дивана встать, вы от него требуете пиво сообщение!

PS асинхронная у нас сеть, асинхронная.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #6 : Май 07, 2013, 19:00 »

можно сделать и синхронной через waitFor...
Записан
Bepec
Гость
« Ответ #7 : Май 07, 2013, 19:19 »

Ещё можно через евентлупы. Но увы, увы.
Записан
iukash
Гость
« Ответ #8 : Май 11, 2013, 12:40 »

Ну если не нужна кроссплатформенность (думаю для курсовой вряд ли), не проще ли без qt это реализовать? На c++ куча примеров в гугле!
Записан
qtest
Гость
« Ответ #9 : Май 16, 2013, 03:43 »

Цитировать
Ну если не нужна кроссплатформенность (думаю для курсовой вряд ли), не проще ли без qt это реализовать? На c++ куча примеров в гугле!
Лучше бы, конечно, в qt, по ЯП проходим именно его, наверняка это будет плюсом. За фортунсервер/клиент большое спасибо, вроде бы получилось переделать в консольный вариант, но:
client.h
Код:
#ifndef CLIENT_H
 #define CLIENT_H

 #include <QtNetwork>
 #include <QTcpSocket>
 #include <QObject>
 class QTcpSocket;
 class Client : public QObject
 {
     Q_OBJECT

 public:
     Client();
     void start();
     QString output;
 private slots:

     void requestNewFortune();
     void readFortune();

 private:

     QTcpSocket *tcpSocket;
     QString currentFortune;
     quint16 blockSize;

 };
#endif // CLIENT_H

client.cpp
Код:
#include <QtNetwork>
#include "client.h"
#include <QTcpSocket>
#include <QObject>







Client::Client()
{
    tcpSocket = new QTcpSocket(this);
    QObject::connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readFortune()));
}



void Client::start()
{
    Client::requestNewFortune();
}




void Client::requestNewFortune()
{
    blockSize = 0;
    tcpSocket->abort();
    tcpSocket->connectToHost(QHostAddress::LocalHost,54942); //<<
}

void Client::readFortune()
{
    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_4_0);

    if (blockSize == 0) {
        if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
            return;

        in >> blockSize;
    }

    if (tcpSocket->bytesAvailable() < blockSize)
        return;

    QString nextFortune;
    in >> nextFortune;




    currentFortune = nextFortune;
    output=currentFortune;
    //qDebug()<<output;
}

main.cpp
Код:
#include <QCoreApplication>
#include <client.h>
#include <iostream>
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    Client client;
    client.start();
    qDebug()<<client.output;
    return app.exec();


}

qDebug()<<output; в клиент.спп нормально выводит то, что нужно, а qDebug()<<client.output; в мейн выводит только """". Почему так и как это исправить?

Есть примеры вроде Fortune server/client для передачи файлов с клиента на сервер?
Записан
Bepec
Гость
« Ответ #10 : Май 16, 2013, 07:07 »

Уточню, ведь опять посыпятся вопросы. Вы послали пакет за пивом сообщением. Он не успел ещё с дивана встать, вы от него требуете пиво сообщение!

PS асинхронная у нас сеть, асинхронная.

Утомляют такие темы. Не понимаешь что тебе пишут - попроси, ещё проще напишу. А если не понимаешь и что-то делаешь, это плохо Веселый
Записан
KrupaKarlo
Гость
« Ответ #11 : Май 16, 2013, 08:38 »

можешь скинуть архивом и сервак и клиент. тогда смогу помочь. А так косяки могут быть где угодно.
Записан
Bepec
Гость
« Ответ #12 : Май 16, 2013, 08:49 »

ДА в одном месте у него косяк.

ППЦ. Жаль, что новички читать не умеют...
Записан
KrupaKarlo
Гость
« Ответ #13 : Май 16, 2013, 09:02 »

Умеют они читать, просто Верес ты ни одного нормального ответа тут не написал. Ты либо форумный троль, либо тебе просто нечего сказать. Даже не знаю что хуже.
Записан
Serr500
Гость
« Ответ #14 : Май 16, 2013, 09:31 »

qDebug()<<output; в клиент.спп нормально выводит то, что нужно, а qDebug()<<client.output; в мейн выводит только """". Почему так и как это исправить?

Вам уже ответили, но Вы, видимо, даже не потрудились понять ответ. Сеть асинхронная. Client::start инициирует процесс, затем классы начинают общаться посредством сигналов. Сигналы начнут обрабатываться только после входа в Event Loop, то есть после вызова QCoreApplication::exec. Следовательно, до его вызова в вашем клиенте не будет полученных данных, даже если они физически были переданы в ваше приложение. Client::readFortune выводит правильные данные именно потому, что этот слот будет вызван сигналом из сокета уже при выполнении Event Loop.

P.S. Почитайте про асинхронные операции.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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