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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Передача файлов по сети  (Прочитано 16326 раз)
BRE
Гость
« Ответ #15 : Ноябрь 07, 2010, 20:08 »

а что это за параметры мне нужно передать? Это я должна проверять сколько изначально файл весит и каждый раз смотреть сколько байт подгружено потом делить на общее количество, умножать на 100% и передавать в progressbar?
Это сигнал, это он тебе эти параметры сообщает, а ты уже должна указываешь их progressbar'у.
Записан
virtual_root
Гость
« Ответ #16 : Ноябрь 07, 2010, 21:01 »

Я добавила сигнал, связала его со слотом, но у меня теперь приложение почему-то не запускается...и я не знаю,что мне в фун-и слота писать...!
В конструкторе класса MainWindow добавила:
 ui->progressBar->reset();
connect(ftp,SIGNAL (dataTransferProgress()),progress,SLOT (setProgress()));

соответственно в .h:
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
     QFtp  *ftp;  // перенесла его сюда
     QProgressBar* progress;

private:
    Ui::MainWindow *ui;

private slots:
    void on_pushButton_clicked();
    void setProgress();


P.S. понимаю,я вас уже замучила...
Записан
virtual_root
Гость
« Ответ #17 : Ноябрь 07, 2010, 21:04 »

убрала строчку соединения сигнала и слота и всё заработало,но progressbar попрежнему не активен..
Записан
BRE
Гость
« Ответ #18 : Ноябрь 07, 2010, 21:11 »

Вначале нужно хорошо разобраться с сигнально-слотовой системой.
Это основы Qt. Без этого ничего толкового сделать не получиться.  Подмигивающий
Читай асистент, смотри примеры.
Записан
virtual_root
Гость
« Ответ #19 : Ноябрь 07, 2010, 22:21 »

будем разбираться;)
Записан
virtual_root
Гость
« Ответ #20 : Ноябрь 09, 2010, 01:13 »

У меня возник ещё один вопрос: а как мне с сервера прочитать атрибуты определенного файла?
Например,дату и время последних изменений в файле?
Записан
BRE
Гость
« Ответ #21 : Ноябрь 09, 2010, 08:19 »

а как мне с сервера прочитать атрибуты определенного файла?
Что подразумевается под сервером?
Если сервер ftp, то в QFtp есть:
int QFtp::list ( const QString & dir = QString() )
Записан
virtual_root
Гость
« Ответ #22 : Ноябрь 09, 2010, 09:25 »

Да, по ftp. Спасибо, посмотрю). И ещё вопрос,пожалуйста,ответьте на него по подробней! Я попробовала написать клиент-сервера через QTcpSocket. У меня возникла проблема: как мне получать номера портов и ip-адрес всех,которые есть в сети? В у меня сеть из трех компьютеров,соединенных не кабелем,а через wifi роутер. Как мне получить их IP-адреса и порт по которому я с ними могу обмениваться данными???
Записан
virtual_root
Гость
« Ответ #23 : Ноябрь 09, 2010, 10:04 »

Кажется с портом я разобралась. Там если поставить , то он выбирвет первый не занятый системой порт. Но как мне получить список всех IP адресов в сети???
Записан
virtual_root
Гость
« Ответ #24 : Ноябрь 10, 2010, 21:29 »

Пожалуйста,подскажите,что не так я пишу?! Почему у меня не передаются сообщения серверу?
Я написала программу клиент-сервер(два в одном). С сервером соединяюсь,получаю от него ответ connected!!!, но сообщение которое я отправляю ему(по нажатию кнопки send) не получаю! Хотя он вроде читает его! Что я всё время упускаю???

Вот код: (файл .h)
Код:
#ifndef SERVERCLIENT_H
#define SERVERCLIENT_H

#include <QtGui>
class QTcpServer;
class QTcpSocket;

class Widget :public QWidget{
    Q_OBJECT
    public:
    QPushButton* connection;
    QPushButton* opendir;
    QPushButton* send;
    QLabel* label_port;
    QLabel* label_answer;
    QLineEdit* IP;
    QLineEdit* Port;
    QLineEdit* letter;
    QTcpServer* TcpServer;
    QTcpSocket* TcpSocket;
    quint16 blockSize;
    Widget();
    public slots:
              void connection_clicked();
              void send_clicked();
              void opendir_clicked();
      virtual void slotNewConnection();
              void slotReadAnswer();
              void sendAnswerToClient(QString& str);
   protected:
            void send_letter_to_client();
};




#endif // SERVERCLIENT_H


Файл .cpp:
Код:
#include "server-client.h"
#include <QDebug>
#include <QFileDialog>
#include <QtNetwork>


Widget::Widget(){
    // кнопка соединения
    connection = new QPushButton(QString("connection"),this);
    QObject::connect(connection,SIGNAL(clicked()),SLOT(connection_clicked()));
    // кнопка отпраки данных
    send = new QPushButton(QString("send"),this);
    QObject::connect(send,SIGNAL(clicked()),SLOT(send_clicked()));
    // кнопка выбора файла
    opendir = new QPushButton(QString("open dir"),this);
    QObject::connect(opendir,SIGNAL(clicked()),SLOT(opendir_clicked()));
    // Label port
    label_port = new QLabel(this);
    label_port->setText("Current Port");
    // Label answer
    label_answer = new QLabel(this);
    label_answer->setText(QString::fromLocal8Bit("Ждём ответа..."));
    // IP
    IP = new QLineEdit(this);
    IP->setText("IP");
    // Port
    Port = new QLineEdit(this);
    Port->setText("Port");
    // Letter
    letter = new QLineEdit(this);
    letter->setText("Enter message");
    // размещение виджетов
    QGridLayout *Layout = new QGridLayout;
    Layout->addWidget(IP,0,0);
    Layout->addWidget(Port,1,0);
    Layout->addWidget(letter,2,0);
    Layout->addWidget(label_port,3,0);
    Layout->addWidget(label_answer,4,0);
    Layout->addWidget(connection,0,1);
    Layout->addWidget(send,1,1);
    Layout->addWidget(opendir,2,1);
    setLayout(Layout);
}


void Widget::connection_clicked(){  //настраиваем сервер на слушание каналов
  TcpServer = new QTcpServer(this);
    if (!TcpServer->listen(QHostAddress::Any,1115)) {
        QMessageBox::critical(this, tr("Server"),
                              tr("Unable to start the server: %1.")
                              .arg(TcpServer->errorString()));
        close();
        return;
    }
    label_port->setText(tr("port %1.\n").arg(TcpServer->serverPort()));  // Выводим порт сервера, если сервер прослушивает соединения, в противном случае выведется 0.
    QObject::connect(TcpServer,SIGNAL(newConnection()),SLOT(slotNewConnection())); // устанавливаем соединение с новым клиентом,который подключился
}

void Widget::send_clicked(){
    TcpSocket = new QTcpSocket(this);
    blockSize = 0;
    TcpSocket->connectToHost(IP->text(),1115);
    send_letter_to_client();
    QObject::connect(TcpSocket, SIGNAL(readyRead()), this, SLOT(slotReadAnswer()));  // читаем ответ сервера
   // посылаем клиенту сообщение
}

void Widget::opendir_clicked(){
  QFileDialog d;
  QString dir_name = d.getExistingDirectory();
}

void Widget::slotNewConnection(){  // создание нового соединения с очередным клиентом
  QString answer="Connected!!!";
  TcpSocket = TcpServer->nextPendingConnection();
  QObject::connect(TcpSocket,SIGNAL(disconnected()),TcpSocket,SLOT(deleteLater()));
  // читаем сообщение клиента,если он что-то нам сообщает
  QObject::connect(TcpSocket, SIGNAL(readyRead()),this,SLOT(slotReadAnswer()));
  sendAnswerToClient(answer);  // отсылаем ответ клиенту
}

void Widget::sendAnswerToClient(QString &str){ // отсылаем сообщение очередному клиенту об успешном соединении
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out << str;
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));
    TcpSocket->write(block);
}

void Widget::slotReadAnswer(){
    TcpSocket = (QTcpSocket*)sender();
    QString str;
    QDataStream in(TcpSocket);
    in.setVersion(QDataStream::Qt_4_5);
    for (;;) {
        if (!blockSize) {
            if (TcpSocket->bytesAvailable() < sizeof(quint16)) {
                break;
            }
            in >> blockSize;
        }

        if (TcpSocket->bytesAvailable() < blockSize) {
            break;
        }
        in >> str;
        blockSize = 0;

    }
  label_answer->setText(str);
}

void Widget::send_letter_to_client(){
    TcpSocket = new QTcpSocket(this);
    QString str;
    str = letter->text();
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out << str;
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));
    TcpSocket->write(block);
}

Записан
virtual_root
Гость
« Ответ #25 : Ноябрь 10, 2010, 22:03 »

АУ!!! Кто-нибудь может мне помочь?Непонимающий
Записан
virtual_root
Гость
« Ответ #26 : Ноябрь 10, 2010, 23:41 »

пока ответят, уже и сам поймешь в чём проблема...хотя всё же не до конца получается...
Записан
virtual_root
Гость
« Ответ #27 : Ноябрь 11, 2010, 00:56 »

У меня так и не получилось решить проблему...((( если кто добрый поможет,буду рада.
Записан
DmP
Гость
« Ответ #28 : Ноябрь 11, 2010, 01:17 »

Так, посмотрим, что видно на первый взгляд:
Цитировать
void Widget::send_clicked(){
    TcpSocket = new QTcpSocket(this);
    ...
    send_letter_to_client();
И:
Цитировать
void Widget::send_letter_to_client(){
    TcpSocket = new QTcpSocket(this);
Возможно, в этом и причина ...
Записан
virtual_root
Гость
« Ответ #29 : Ноябрь 11, 2010, 09:34 »

void Widget::send_letter_to_client(){
    TcpSocket = new QTcpSocket(this);  - удалила.

Я заметила странную вещь. Беру пример из книги Макса Шлее(server) и с помощью моей программы мои сообщения приходят на этот сервер(настраиваю их на один канал), а вот на мою же программу,которая у меня и клиент и сервер одновременно, они не доходят...
Может кто ещё посмотрит что же не так?Непонимающий
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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