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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Обмен QTcpServer  (Прочитано 15435 раз)
BigHom
Гость
« Ответ #15 : Январь 27, 2015, 12:08 »

Запускаю свою программу сервера. Начинаю выдавать информацию. Клиент всё принимает. Добиваюсь чтоб зависла и выдача прекратилась.
Далее не выключая своей программы , даю с консоли команду на сервере , выдававшем информацию:
Код:
service network restart
 Спустя пару секунд в клиент приходят остальные байты...которые не были дополучены.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #16 : Январь 27, 2015, 12:31 »

без минимального рабочего примера тебе никто не сможет помочь - ни тут, ни в техподдержке мсвс
Записан
Bepec
Гость
« Ответ #17 : Январь 27, 2015, 12:32 »

Это называется толочь воду в ступе.
На вопросы отвечаете не точно, расплывчато.
Вместо рекомендаций делаете свои умозаключения, не дающие никакой информации.
Игнорируете просьбу выложить код.

Это что угодно, а не заинтересованность в решении вопроса Веселый
Записан
BigHom
Гость
« Ответ #18 : Январь 27, 2015, 13:13 »

main.cpp
Код:
#include <QtGui/QApplication>
#include "myserver.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyServer server(2323);
server.show();
return app.exec();
}
Код Myserver.h
Код:
#ifndef MYSERVER_H
#define MYSERVER_H

#include <QWidget>
#include <QtGui/QMainWindow>
//#include "ui_myserver.h"
#include <QtNetwork>
#include <QtXml>

class QTcpServer;

class MyServer : public QWidget{
Q_OBJECT
private:

QTcpServer* m_ptcpServer;
QPushButton* pushButton_1;
    qint16      m_nNextBlockSize;


private:
void sendToClient(QTcpSocket* pSocket, const QString& str);
void copyf(const QString& str1,const QString& str2);

public:
MyServer(int nPort, QWidget* pwgt =0);

public slots:
virtual void slotNewConnection();
        void slotReadClient();
        void slotpushButton_1( );
};
#endif // MYSERVER_H
код Myserver.cpp
Код:
#include "myserver.h"
//#include "QTcpServer"
#include <QWidget>
#include <QtGui>
#include <QtNetwork>
#include <QMessageBox>
#include <QTextEdit>
#include <QPushButton>
//#include "ui_myserver.h"
#include <QtXml>

QTcpSocket* pClientSocket;


MyServer::MyServer(int nPort, QWidget* pwgt /*=0*/)
: QWidget(pwgt),m_nNextBlockSize(0)
{
pushButton_1 = new QPushButton(QObject::tr("data"),  this);
connect(PushButton_1,SIGNAL(clicked()),this,SLOT(slotPushButton_1()));

QGridLayout * pLArch=new QGridLayout(this);
pLArch->addWidget(pushButton_1,0,0,1,1);

    int nPorta=2323;
    m_ptcpServer = new QTcpServer(this);
    if (!m_ptcpServer->listen(QHostAddress::Any,nPorta))
        {
                QMessageBox::critical(0, "server error", "Unable to start the server:"+
                        m_ptcpServer->errorString());
                m_ptcpServer->close();
                return;
        }
    connect(m_ptcpServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
}

//====================================================================
void MyServer::slotpushButton_1()
{// выдача сообщения клиенту

QString ss=""; //далее считываю в ss = млн.байт
QTextStream out(pClientSocket);
out<<ss;


}
//===========================================================================
void MyServer::slotNewConnection()
{
iclientov++;
// QTcpSocket*
pClientSocket =m_ptcpServer->nextPendingConnection();
connect(pClientSocket,SIGNAL(disconnected()),
   pClientSocket,SLOT(deleteLater()));
connect(pClientSocket,SIGNAL(readyRead()),
   this,SLOT(slotReadClient()));
}

//================================== приём сообщений от клиента
void MyServer::slotReadClient()
{
        QFile file("a.xml");                    // файл приёма
    if (file.open(QIODevice::Append)){
        QByteArray arrBlock;
        QTextStream in(pClientSocket);
        QString str=in.readAll();
        arrBlock=str.toAscii () ;
        file.write(arrBlock);
        arrBlock.clear ();
        file.close();
        }

   }

В файле b.xml нужно предварительно записать редактором 1млн. байтов
« Последнее редактирование: Январь 28, 2015, 13:07 от BigHom » Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #19 : Январь 27, 2015, 14:41 »

это не qt3, код не собирается
выкладывай весь проект архивом чтобы только qmake && make подать
Записан
BigHom
Гость
« Ответ #20 : Январь 27, 2015, 14:54 »

Да, немного ошибся, сервер написан  QT4.5.3 - а который принимает на QT3 .  Сорри, немного перепутал. Я убрал из своей программы всё лишнее, оставил только то, что касается обмена.
Записан
Bepec
Гость
« Ответ #21 : Январь 27, 2015, 16:17 »

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

Делайте тогда уж минимальный проект, выдающий ошибку. Демонстрирующий проблему. А не куцый кусок копыта от коня, которого надо лечить.
Записан
BigHom
Гость
« Ответ #22 : Январь 28, 2015, 13:05 »

это не qt3, код не собирается
выкладывай весь проект архивом чтобы только qmake && make подать
У меня всё собралось, чуть чуть подправил вот что получилось:

main.cpp
Код:
#include <QtGui/QApplication>
#include "ServOtl.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
        ServOtl server(2323);
server.show();
return app.exec();
}

ServOtl.h
Код:
#ifndef ServOtl_H
#define ServOtl_H

#include <QWidget>
#include <QtGui/QMainWindow>
//#include "ui_myserver.h"
#include <QtNetwork>
#include <QtXml>

class QTcpServer;
class QTcpSocket;
class QPushButton;
class QTextEdit;
class QLineEdit;

class ServOtl : public QWidget{
Q_OBJECT
private:

QTcpServer* m_ptcpServer;
        QPushButton* pushButton_1;
        QTextEdit* m_ptxtInfo;
        QLineEdit* m_ptxtInput;
    qint16      m_nNextBlockSize;
        QTextEdit* m_ptxt1;
        QTextEdit* m_ptxt2;


private:
void sendToClient(QTcpSocket* pSocket, const QString& str);
void copyf(const QString& str1,const QString& str2);

public:
        ServOtl(int nPort, QWidget* pwgt =0);

public slots:
virtual void slotNewConnection();
        void slotReadClient();
        void slotPushButton_1( );
};
#endif


ServOtl.cpp
Код:
#include "ServOtl.h"
//#include "QTcpServer"
#include <QWidget>
#include <QtGui>
#include <QtNetwork>
#include <QMessageBox>
#include <QTextEdit>
#include <QPushButton>
#include <QMessageBox>
#include <QtXml>

QTcpSocket* pClientSocket;


ServOtl::ServOtl(int nPort, QWidget* pwgt /*=0*/)
: QWidget(pwgt),m_nNextBlockSize(0)
{
    ServOtl::setGeometry(QRect(20, 20, 510, 500));
pushButton_1 = new QPushButton(QObject::tr("data"),  this);
        connect(pushButton_1,SIGNAL(clicked()),this,SLOT(slotPushButton_1()));

        m_ptxtInfo= new QTextEdit;
        m_ptxtInput=new QLineEdit;
        m_ptxt1= new QTextEdit;
        m_ptxt1->setReadOnly(true);
        m_ptxt2= new QTextEdit;
        m_ptxt2->setReadOnly(true);

        m_ptxtInfo->setReadOnly(true);

QGridLayout * pLArch=new QGridLayout(this);
        pLArch->addWidget (new QLabel((QApplication::translate("MyServerClass", "\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273", 0, QApplication::UnicodeUTF8)) ),0,0,1,1);
        pLArch->addWidget (new QLabel((QApplication::translate("MyServerClass", "\320\276\320\272\320\275\320\276 \320\277\321\200\320\270\320\275\321\217\321\202\321\213\321\205 \321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\271", 0, QApplication::UnicodeUTF8)) ),0,1,1,1);
        pLArch->addWidget(m_ptxt1,1,0,1,1);
        pLArch->addWidget(m_ptxt2,1,1,1,1);
        pLArch->addWidget(pushButton_1,2,0,1,1);

    int nPorta=2323;
    m_ptcpServer = new QTcpServer(this);
    if (!m_ptcpServer->listen(QHostAddress::Any,nPorta))
        {
                QMessageBox::critical(0, "server error", "Unable to start the server:"+
                        m_ptcpServer->errorString());
                m_ptcpServer->close();
                return;
        }
    connect(m_ptcpServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
}

//====================================================================
        void ServOtl::slotPushButton_1()
{// выдача сообщения клиенту

        QString ss="1"; //далее считываю в ss = млн.байт
        QFile file("d.dat");                    // файл приёма
        if (file.open(QIODevice::ReadOnly)){
            QTextStream out(pClientSocket);
            ss+=file.readAll();
            out<<ss;
            file.close();
        } else{
            QMessageBox::about(this,"error","file open");
        }


}
//===========================================================================
void ServOtl::slotNewConnection()
{
// QTcpSocket*
//            QMessageBox::about(this,"new Connection","slotNewConnection");
        pClientSocket =m_ptcpServer->nextPendingConnection();
connect(pClientSocket,SIGNAL(disconnected()),
    pClientSocket,SLOT(deleteLater()));
connect(pClientSocket,SIGNAL(readyRead()),
    this,SLOT(slotReadClient()));
        QTime time=QTime::currentTime ();
        m_ptxt2->append(time.toString()+" "+ "serv << client : "+
                (QApplication::translate("MyClientClass","\321\201\320\276\320\265\320\264\320\270\320\275\320\265\320\275\320\270\320\265 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\276", 0, QApplication::UnicodeUTF8)));
// iclientov=1;
}

//================================== приём сообщений от клиента
void ServOtl::slotReadClient()
{
        QFile file("a.xml");                    // файл приёма
    if (file.open(QIODevice::Append)){
        QByteArray arrBlock;
        QTextStream in(pClientSocket);
        QString str=in.readAll();
        arrBlock=str.toAscii () ;
        file.write(arrBlock);
        arrBlock.clear ();
        file.close();
        QTime time;
        if(str.length()>100){str=str.left(10)+"...";}
        QString strMessage= time.toString()+" "+ "serv << client :" + str;
//                m_ptxtInfo->append(strMessage);
        m_ptxt2->append(strMessage);
        }

   }


ServOtl.pro
Код:
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += ServOtl.h
SOURCES += main.cpp ServOtl.cpp

TEMPLATE  =app
CONFIG += qt warn_on thread plugin
INCLUDEPATH  += .
LANGUAGE  = C++
QT += gui core sql xml network
В файле d.dat нужно предварительно записать редактором 1млн. байтов - файл выдачи в сеть по нажатии кнопки
« Последнее редактирование: Январь 30, 2015, 11:08 от BigHom » Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #23 : Январь 28, 2015, 13:36 »

в qt3 все хеадеры с маленькой буквы, тут qt4
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #24 : Январь 28, 2015, 14:01 »

ок, пусть есть сервер, ну а клиент то где ?
Записан
BigHom
Гость
« Ответ #25 : Январь 30, 2015, 11:15 »

ок, пусть есть сервер, ну а клиент то где ?

По аналогии с сервером программа клиента:
main.cpp
Код:
#include <QtGui/QApplication>
#include "myclient.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
        //MyClient client("LocalHost",2323);
        MyClient client("server1",2323);
client.show();
return app.exec();
}

MyClient.h:
Код:
#ifndef MYCLIENT_H
#define MYCLIENT_H

#include <QWidget>
#include <QTcpSocket>
#include <QtGui/QMainWindow>
#include <QtNetwork>
#include <QtXml>
 

class QTextEdit;
class QLineEdit;
class QPushButton;
static int insoob=0,inmsg;

class MyClient : public QWidget
{
Q_OBJECT
private:
QTcpSocket* m_pTcpSocket;
QTextEdit* m_ptxtInfo;
QLineEdit* m_ptxtInput;
qint16 m_nNextBlockSize;

QTextEdit* m_ptxt;
QTextEdit* m_ptxt1;
QTextEdit* m_ptxt2;
QPushButton* pushButton_1;
QPushButton* pushButton_2;
QPushButton* pushButton_3;
        QPushButton* pushButton_4;
        QPushButton* pushButton_5;
        QPushButton* pushButton_6;
        QPushButton* pushButton_7;
        QPushButton* pushButton_8;
        QPushButton* pushButton_9;
        QPushButton* pushButton_10;
        QPushButton* pushButton_11;
        QPushButton* pushButton_12;
        QPushButton* pushButton_13;
        QPushButton* pushButton_14;
        QPushButton* pushButton_15;
        QPushButton* pushButton_16;

public:
MyClient(const QString& strHost, int nPort, QWidget* pwgt =0);
private slots:
void slotReadyRead();
void slotError (QAbstractSocket::SocketError);
void slotSendToServer();
void slotConnected();

};

#endif // MYCLIENT_H


MyClient.cpp
Код:
#include "myclient.h"
#include <QTcpSocket>
#include <QtGui/QMainWindow>
#include <QtNetwork>
#include <QMessageBox>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QApplication>
#include <QLabel>

 int iclientov=0;
 QString sss="";

MyClient::MyClient(const QString& strHost, int nPort, QWidget* pwgt /*=0*/)
:QWidget(pwgt), m_nNextBlockSize(0)
{
QString str=QDir::currentPath();
MyClient::setGeometry(QRect(20, 20, 710, 520));
MyClient::setWindowTitle(QApplication::translate("MyClientClass", "\320\270\320\274\320\270\321\202\320\260\321\202\320\276\321\200 \320\272\320\273\320\270\320\265\320\275\321\202\320\260", 0, QApplication::UnicodeUTF8));

m_pTcpSocket=new QTcpSocket(this);
m_pTcpSocket->connectToHost(strHost, nPort);


connect(m_pTcpSocket, SIGNAL(connected()), SLOT(slotConnected()) );
connect(m_pTcpSocket, SIGNAL(readyRead()), SLOT(slotReadyRead()) );
connect(m_pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(slotError(QAbstractSocket::SocketError)) );

m_ptxtInfo= new QTextEdit;
m_ptxtInput=new QLineEdit;

m_ptxtInfo->setReadOnly(true);

QPushButton* pcmd = new QPushButton("&Send");
connect(pcmd, SIGNAL(clicked()), SLOT(slotSendToServer()));
connect(m_ptxtInput, SIGNAL(returnPressed()),this, SLOT(slotSendToServer()));

QVBoxLayout* pvbxLayout = new QVBoxLayout;
pvbxLayout-> addWidget(new QLabel("<H1>Client</H1>"));
pvbxLayout-> addWidget(m_ptxtInfo);
pvbxLayout-> addWidget(m_ptxtInput);
pvbxLayout-> addWidget(pcmd);

m_ptxt= new QTextEdit;
m_ptxt->setReadOnly(true);

m_ptxt1= new QTextEdit;
// m_ptxt1->setReadOnly(true);
m_ptxt2= new QTextEdit;
m_ptxt2->setReadOnly(true);



        QGridLayout * pLArch=new QGridLayout(this);

        pLArch->addWidget (new QLabel((QApplication::translate("MyServerClass", "\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273", 0, QApplication::UnicodeUTF8)) ),5,0,1,1);
        pLArch->addWidget (new QLabel((QApplication::translate("MyServerClass", "\320\276\320\272\320\275\320\276 \320\277\321\200\320\270\320\275\321\217\321\202\321\213\321\205 \321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\271", 0, QApplication::UnicodeUTF8)) ),5,1,1,1);
        pLArch->addWidget(m_ptxt,6,0,1,1);
        pLArch->addWidget(m_ptxt2,6,1,1,1);
        pLArch->addWidget(pcmd,7,0,1,1);
}

void MyClient::slotReadyRead()
{
    QTime time;
        QString strMessage= time.toString()+" "+ "serv >> client :ReadyRead";
        m_ptxt->append(strMessage);

    QFile file("a.xml");                    // файл приёма
    if (file.open(QIODevice::Append)){

        QByteArray arrBlock;
        QTextStream in(m_pTcpSocket);
        QString str=in.readAll();
        arrBlock=str.toAscii () ;
        file.write(arrBlock);
        arrBlock.clear ();

        //QTime time;
        /*QString*/ strMessage= time.toString()+" "+ "serv >> client :" + str;
//                m_ptxtInfo->append(strMessage);
m_ptxt->append(strMessage);

                file.close();
                //otvet();
            }else {m_ptxtInfo->append("slotReadClient:no read file : a.xml");}
}

void MyClient::slotError(QAbstractSocket::SocketError err)
{
QString strError="Error: no connect";
//m_ptxtInfo->append(strError);
m_ptxt->append(strError);
}

void MyClient::slotSendToServer()
{
        QString ss="mmm";

        QFile file("d.dat");                    // файл приёма
        if (file.open(QIODevice::ReadOnly)){
            QTextStream out(m_pTcpSocket);
            ss+=file.readAll();

            out<<ss;
            file.close();
        } else{
            QMessageBox::about(this,"error","file open: d.dat");
        }
        // QTextStream out(m_pTcpSocket);
        // out<<ss;
}

void MyClient::slotConnected()
{
// m_ptxtInfo->append("Received the connected() signal");
//=======================================
QTime time=QTime::currentTime ();
m_ptxt2->append(time.toString()+" "+ "serv >> client : "+
(QApplication::translate("MyClientClass","\321\201\320\276\320\265\320\264\320\270\320\275\320\265\320\275\320\270\320\265 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\276", 0, QApplication::UnicodeUTF8)));
iclientov=1;
}



MyClient.pro
Код:
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
QT += qui network xml xmlpatterns

# Input
HEADERS += myclient.h
SOURCES += main.cpp myclient.cpp


Также как для сервера создать редактором файл d.dat для передачи серверу

Немного скорректировал сервер - выше подправил коды. И перед обменом между машинами в системе МСВС надо настроить сеть один как клиент , а 2-й комп настроить как сервер с названием server1
« Последнее редактирование: Январь 30, 2015, 11:18 от BigHom » Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #26 : Январь 30, 2015, 13:26 »

передает данные туда и обратно, нет бага

зачем в коде есть "str.toAscii" ?

на будущее если будешь выкладывать проекты - прикрепляй их zip архивом
Записан
Bepec
Гость
« Ответ #27 : Январь 30, 2015, 13:32 »

Гениально)
Предположение моё написанное на 1 странице верно - проблема в системе. Веселый
Записан
BigHom
Гость
« Ответ #28 : Январь 30, 2015, 14:03 »

передает данные туда и обратно, нет бага

зачем в коде есть "str.toAscii" ?

на будущее если будешь выкладывать проекты - прикрепляй их zip архивом

файл 2млн.байт передаёт без зависания?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #29 : Январь 30, 2015, 14:08 »

да 3 млн передал, и три раза, и в обе стороны

но я заменил "server1" на IP т.к. не имею dhcp, но это не должно оказывать влияние т.к. нужно только для коннекта

Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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