Нужна срочно помощь по написанию сервер-клиент приложения, нада чтоб с клиента передавался запрос (стринг) и от того что в стринге сервер отсылает ответ...
читаю на сервере при входящем соединении
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;
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();
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();
Как я понимаю ты за основу взял: 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);
}
Я пытаюсь при установлении соединения сразу писать в поток к серверу, а клиент ждет от сервера даные как только чтото появляеться, вызываеться функция чтения , что не так?
Судя по использованию функции waitForReadyRead не как только что-то появляется.
Используй сигналы и слоты для ожидания поступления новых данных...
Просто ты скрещиваешь синхронную и асинхронные модели...
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)