Edit: Votre erreur est que vous ouvrez le flux de données out
en mode lecture seule, mais essayez de écrire le tableau d'octets reçu à elle:
void Server::readyRead()
{
QByteArray block;
QDataStream out(&block, QIODevice::ReadOnly); // !mistake, WriteOnly mode is needed
out << tcpSocket->readAll(); // this is write operation
//...
}
supplémentaires: s'il vous plaît noter qu'il ya le Serialization mechanism of Qt Data Types qui est utile dans de tels cas:
tSock->write(block); // this is write just a raw data of the block, not the "QByteArray"
Vous pouvez utiliser une opération de flux pour écrire les types de données Qt nécessaires à une prise directement, sans convertion à QByteArray
:
// Connect firstly
tSock->connectToHost(ipAddress, portNumb.toInt());
tSock->waitForConnected();
// Then open a data stream for the socket and write to it:
QDataStream out(tSock, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << name; // write string directly without a convertion to QByteArray
// Then you may
tSock->flush();
côté client, puis utilisez l'opération de flux similaire sur le côté serveur :
void Server::readyRead()
{
QString name;
QDataStream in(tcpSocket, QIODevice::ReadOnly /*or QIODevice::ReadWrite if necessary */);
in.setVersion(QDataStream::Qt_4_0);
in >> name; // read the string
//...
}
Il est également possible de lecture/écriture objets i/périphériques o d'une autre Qt: QFile, QSerialPort, QProcess, QBuffer et d'autres.
Modifier 2: il n'est pas garanti que sur le signal readyRead
vous recevrez le package complet qui a été envoyé. Par conséquent, voir l'exemple ci-dessous.
S'il vous plaît noter, que dans le cas réel (lorsque vous avez plusieurs paquets différents dans la communication client-serveur, et on ne sait pas quel genre de plusieurs paquets possibles que vous avez reçu) habituellement on utilise algorithme plus complexe, car les situations suivantes peuvent se produire sur l'événement readyRead dans une communication:
- paquet reçu
pleine
- reçu qu'une partie du paquet
- a reçu plusieurs paquets ensemble
la variante de l'algorithme (Qt 4 Fortune Client Example):
void Client::readFortune() // on readyRead
{
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;
//...
}
Qt 4.0 est une version trop ancienne de Qt, donc voir aussi Qt 5.9 Fortune Client Example
D'une manière générale, recréant un 'QDataStream' sur une prise ou est une erreur, car vous perdrez l'état du cours d'eau, et peut perdre des données ainsi que. –
@KubaOber, mais ceci est un exemple de la documentation Qt 4, et je suis sûr que le code de la fonction 'readFortune()' ci-dessus est correct –
Il est correct tel quel, mais il deviendra facilement incorrect dès que vous modifiez-le. –