QTcpServer가 있습니다. 클라이언트 측에서 큰 데이터를 보내고 모든 데이터가 서버에서 수신되면 신호를 잡는 방법을 원하십니까? "while (socket-> bytesavailable)"이 작동하지 않습니다. 이에QTcpSocket readyRead() 신호가 두 번 울립니다.
:
qbytearray 크기가 4000 또는 5000의 서버, 클라이언트에서 보내는 9000입니다 ...
예 2 : 예를 들어
Case readyRead() SIGNAL Emitted 8 회입니다.
void Client::SendMessage(std::vector<QString>)
{
MyClass _Send;
_Send.Age = 22;
_Send.School = 14;
_Send.Name = "Taz";
QVector<MyClass2> vv;
for (int i = 0; i < 15000; i++) {
vv.push_back(MyClass2(24, "leri"));
vv.push_back(MyClass2(22, "tazo"));
}
_Send.vctr = vv;
QByteArray bytes;
QDataStream stream(&bytes, QIODevice::WriteOnly);
int FunctionUID = 331;
int ij, ik = ij = 169;
MyClass2 faf(-31, "15");
stream << FunctionUID << _Send << faf << ij << ik;
socket->write(bytes);
}
void Server::ImReady()
{
QByteArray buf;
buf = socket->readAll();
QDataStream stream(&buf, QIODevice::ReadOnly);
int FunctionUID, ij, ik;
MyClass vv;
MyClass2 vv1;
stream >> FunctionUID >> vv >> vv1 >> ij >> ik;
qDebug() << vv.vctr.size() << "faf";
}
void Server::incomingConnection(qintptr val)
{
qDebug() << "Client Connected" << val;
socket = new QTcpSocket;
socket->setSocketDescriptor(val);
if (!socket) {
return;
}
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
connect(socket, SIGNAL(readyRead()), this, SLOT(ImReady()));
}
데이터가 항상 단일 패킷으로 전송되는 것은 아닙니다. 크기가 클 경우 데이터 덩어리로 보낼 수 있습니다. 이것은 아마도 여러 개의'readyRead' 신호를받는 이유 일 것입니다. – vahancho
Qt 5.7 또는 그 이후 버전을 사용하고 있다면'QDataStream'에서 [read transactions] (http://doc.qt.io/qt-5/qdatastream.html#using-read-transactions)를 이용할 수 있습니다. [fortune 클라이언트 예제] (http://doc.qt.io/qt-5/qtnetwork-fortuneclient-example.html)에서 구현 방법을 확인하십시오. – thuga