Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Срочно нужна помощь

Автор: Slon 7.6.2010, 2:10

Нужна срочно помощь по написанию сервер-клиент приложения, нада чтоб с клиента передавался запрос (стринг) и от того что в стринге сервер отсылает ответ...
читаю на сервере при входящем соединении

void Server_Cast::incomingConnection(int socketDescriptor)
{

    //QMessageBox::information(0,"",re);
    /*ClientSocket *socket  = new ClientSocket (this);
    if (!socket->setSocketDescriptor(socketDescriptor)) {
        emit error(socket->error());
        return;
    }*/


     QTcpSocket tcpSocket;
     if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
         emit error(tcpSocket.error());
         return;
     }

     QDataStream in(&tcpSocket);
     in.setVersion(QDataStream::Qt_4_0);
qDebug () <<"Size 1"<<blockSize;
     if (blockSize == 0) {
         if (tcpSocket.bytesAvailable() < (int)sizeof(quint16))
             return;
        qDebug () <<"Size"<<blockSize;
         in >> blockSize;
     }
     qDebug () <<"Size 2"<<blockSize<<" df "<<tcpSocket.bytesAvailable();
     if (tcpSocket.bytesAvailable() < blockSize) {return;}
qDebug () <<"Size 3"<<blockSize;
     QString nextFortune;
     in >> nextFortune;


дебаг пишет
Size 1 65196
Size 2 65196 df 0
Size 3 65196

с клиента пишу :
QString fortune, ty;
     fortune = "as";
     ty = "cv";
     Client_cast_Thread *thread = new Client_cast_Thread(fortune, this);
     connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
     thread->start();

где Server_cast_Thread:
QByteArray block;
     QDataStream out(&block, QIODevice::WriteOnly);
     out.setVersion(QDataStream::Qt_4_0);
     out << (quint16)0;
     out << text;
     out.device()->seek(0);
     out << (quint16)(block.size() - sizeof(quint16));
        qDebug() << blockSize;
     tcpSocket.write(block);
     //tcpSocket.flush();
     tcpSocket.waitForReadyRead();


дебаг видает размер 61453 block вроде правильно отравляется..
запись вызываю с tcpSocket SIGNAL(connected());
Пытался на сервере конект функции чтения сделать от сигнала readReady();
Не вызывается вообще ничего в результати, если я понял даные с клиента просто не доходят до сервера, так как при поступлении даных сразу появляеться сигнал readReady(); Подскажите как организовать отсилку запроса из клиента серверу... Куда копать... Заранее спасибо

Автор: ViGOur 7.6.2010, 18:49

Как я понимаю ты за основу взял: http://doc.crossplatform.ru/qt/4.6.x/network-fortuneserver.html и http://doc.crossplatform.ru/qt/4.6.x/network-fortuneclient.html.

Если глянуть в пример клиента, то как он готовится к получению данных, то waitForReadyRead ты не увидишь, так как данная функция используется в синхронном режиме работы с сокетами, а по умолчанию в Qt используется асинхронная модель работы с сокетами.

Клиент в меcто этого подготавливается к получению данных связывая сигнал readyRead со слотом readFortune, в котором уже и принимает отправленные сервером данные.

connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readFortune()));
...
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;

     if (nextFortune == currentFortune) {
         QTimer::singleShot(0, this, SLOT(requestNewFortune()));
         return;
     }

     currentFortune = nextFortune;
     statusLabel->setText(currentFortune);
     getFortuneButton->setEnabled(true);
}

Автор: Slon 7.6.2010, 21:11

Я пытаюсь при установлении соединения сразу писать в поток к серверу, а клиент ждет от сервера даные как только чтото появляеться, вызываеться функция чтения , что не так?

Автор: ViGOur 8.6.2010, 11:12

Судя по использованию функции waitForReadyRead не как только что-то появляется.
Используй сигналы и слоты для ожидания поступления новых данных...

Просто ты скрещиваешь синхронную и асинхронные модели...

Цитата
bool QAbstractSocket::waitForReadyRead ( int msecs = 30000 ) [virtual]
This function blocks until data is available for reading and the readyRead() signal has been emitted. The function will timeout after msecs milliseconds; the default timeout is 30000 milliseconds.
The function returns true if the readyRead() signal is emitted and there is data available for reading; otherwise it returns false (if an error occurred or the operation timed out).

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)