crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Срочно нужна помощь, QTcpServer
Гость_Slon_*
сообщение 7.6.2010, 2:10
Сообщение #1





Гости








    


Нужна срочно помощь по написанию сервер-клиент приложения, нада чтоб с клиента передавался запрос (стринг) и от того что в стринге сервер отсылает ответ...
читаю на сервере при входящем соединении
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
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3274
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Как я понимаю ты за основу взял: Fortune Server и Fortune Client.

Если глянуть в пример клиента, то как он готовится к получению данных, то 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
Сообщение #3





Гости








    


Я пытаюсь при установлении соединения сразу писать в поток к серверу, а клиент ждет от сервера даные как только чтото появляеться, вызываеться функция чтения , что не так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 8.6.2010, 11:12
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3274
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Судя по использованию функции 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).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 21.7.2017, 13:47