Привет, сервер отправляет строку клиенту,но до клиента строка не доходит. Передаю строку: "==="
void MainWindow::slotReadyRead()
{
QDataStream in(pSocket);
in.setVersion(QDataStream::Qt_4_8);
forever
{
if ( ! nextBlockSize)
{
if (pSocket->bytesAvailable() < sizeof(quint16))
break;
in >> nextBlockSize;
}
if (pSocket->bytesAvailable() < nextBlockSize)
qDebug()<<"fail";
qDebug()<<"bytesAvailable()"<<pSocket->bytesAvailable(); //bytesAvailable() 38
qDebug()<<"nextBlockSize"<<nextBlockSize; //nextBlockSize 51413
break;
QString str;
in >> str;
qDebug()<<"Str";
qDebug()<<str;
nextBlockSize = 0;
}
}
Последний break должен быть внутри последнего if'a.
Как-то так:
if (pSocket->bytesAvailable() < nextBlockSize)
{
qDebug()<<"fail";
qDebug()<<"bytesAvailable()"<<pSocket->bytesAvailable(); //bytesAvailable() 38
qDebug()<<"nextBlockSize"<<nextBlockSize; //nextBlockSize 51413
break;
}
if (pSocket->bytesAvailable() < nextBlockSize)
{
qDebug()<<"fail";
qDebug()<<"bytesAvailable()"<<pSocket->bytesAvailable(); //bytesAvailable() 38
qDebug()<<"nextBlockSize"<<nextBlockSize; //nextBlockSize 51413
break;
}
void MainWindow::sendToClientList(QTcpSocket *pSocket, const QString &str)
{
QByteArray arrBlock;
QDataStream out(&arrBlock, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_8);
qDebug()<<"str send"<<str;
out << quint16(0)<< str;
out.device()->seek(0);
out << quint16(arrBlock.size() - sizeof(quint16));
pSocket->write(arrBlock);
}
...
ui->setupUi(this);
sendToClientList(socket, "hello");
...
if (pSocket->bytesAvailable() < nextBlockSize)
{
qDebug()<<"fail";
qDebug()<<"bytesAvailable()"<<pSocket->bytesAvailable(); //bytesAvailable() 38
qDebug()<<"nextBlockSize"<<nextBlockSize; //nextBlockSize 51413
break;
}
void MainWindow::sendToClientList(QTcpSocket *pSocket, const QString &str)
{
QByteArray arrBlock;
QDataStream out(&arrBlock, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_8);
qDebug()<<"str send"<<str;
out << quint16(0)<< str;
out.device()->seek(0);
out << quint16(arrBlock.size() - sizeof(quint16));
pSocket->write(arrBlock);
}
...
ui->setupUi(this);
sendToClientList(socket, "hello");
...
напиши вариант который ты реально запускаешь
напиши вариант который ты реально запускаешь
Не забудь на отправляющей стороне сделать flush, иначе данные могут подзависнуть в буфере сокета.
void CuteNotes::slotReadyRead()
{
qDebug()<<"slot ready read activated"; //слот вызывается
QDataStream in(pSocket);
in.setVersion(QDataStream::Qt_4_8);
forever
{
if ( ! nextBlockSize)
{
if (pSocket->bytesAvailable() < sizeof(quint16))
break;
in >> nextBlockSize;
if (pSocket->bytesAvailable() < nextBlockSize)
break;
QString str;
in >> str;
qDebug()<<"Str";
qDebug()<<str;
nextBlockSize = 0;
}
}
}
вот что еще заметил, при передачи трех раз вот какой дебаг:
pSocket->bytesAvailable() 16
nextBlockSize 30933
pSocket->bytesAvailable() 32
nextBlockSize 30933
pSocket->bytesAvailable() 48
nextBlockSize 30933
Вот так надо:
void CuteNotes::slotReadyRead()
{
qDebug()<<"slot ready read activated"; //слот вызывается
QDataStream in(pSocket);
in.setVersion(QDataStream::Qt_4_8);
forever
{
if ( ! nextBlockSize)
{
if (pSocket->bytesAvailable() < sizeof(quint16))
break;
in >> nextBlockSize;
}
if (pSocket->bytesAvailable() < nextBlockSize)
break;
QString str;
in >> str;
qDebug()<<"Str";
qDebug()<<str;
nextBlockSize = 0;
}
}
void CuteNotes::slotReadyRead()
{
qDebug()<<"slot activated";
QDataStream in(pSocket);
in.setVersion(QDataStream::Qt_4_8);
forever
{
if ( ! nextBlockSize)
{
if (pSocket->bytesAvailable() < sizeof(quint16))
{
qDebug()<<"fail";
break;
}
in >> nextBlockSize;
}
if (pSocket->bytesAvailable() < nextBlockSize)
{
qDebug()<<"fail2";
qDebug()<<"pSocket->bytesAvailable()"<<pSocket->bytesAvailable();
qDebug()<<"nextBlockSize"<<nextBlockSize;
break;
}
QString str;
in >> str;
qDebug()<<str;
nextBlockSize = 0;
}
}
pSocket->bytesAvailable() 16
nextBlockSize 59605
slot activated
fail2
pSocket->bytesAvailable() 32
nextBlockSize 59605
slot activated
fail2
pSocket->bytesAvailable() 48
nextBlockSize 59605
1. Зачем все время разный код пишешь? Последний вариант нормальный.
2. Проверь значение quint16(arrBlock.size() - sizeof(quint16)); перед записью
3. Проверь что перед циклом nextBlockSize проинициализирован нулем
опять проблемы, почему то теперь данные вообще не прияходят от сервера к клиенту.
Сервер.(отправляет список)
void MainWindow::sendToClientList(QTcpSocket *pSocket, const QStringList &str)
{
QByteArray arrBlock;
QDataStream out(&arrBlock, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_8);
qDebug()<<"str send"<<str;
out << quint16(0)<< str;
out.device()->seek(0);
out << quint16(arrBlock.size() - sizeof(quint16));
//qDebug()<<quint16(arrBlock.size() - sizeof(quint16));
pSocket->write(arrBlock);
pSocket->flush();
}
void CuteNotes::slotReadyRead()
{
nextBlockSize =0;
qDebug()<<"slot ready read activated"; //слот вызывается
QDataStream in(pSocket);
in.setVersion(QDataStream::Qt_4_8);
forever
{
if ( ! nextBlockSize)
{
if (pSocket->bytesAvailable() < sizeof(quint16))
break;
in >> nextBlockSize;
}
if (pSocket->bytesAvailable() < nextBlockSize)
break;
QString str;
in >> str;
qDebug()<<"Str";
qDebug()<<str;
nextBlockSize = 0;
}
}
nextBlockSize =0;
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)