У меня есть Client/Server на основе Qt приложения, используя QTcpServer и QTcpSocket, мне удалось сделать подключение и отправить некоторые данные вперед и назад между клиента и сервера. Клиент посылает множество типов данных на сервер (String, Int, файлов и аудио потока в режиме реального времени), а с моего сервера impliment один ввода данных SLOT (readyRead()):Qt, Отправка нескольких типов данных от клиента на сервер + потоковые данные
connect(socket, SIGNAL(readyRead()),this, SLOT(readyRead()));
Я DON» я знаю, как я мог различать все эти полученные данные и соответственно называть правильную функцию на сервере.
Example (in the server):
- if I receive string => call function showData(QString data);
- if I receive file => call function saveFile(QFile file);
- if I receive audio stream => play audio stream
- ...
SERVER:
void Server::newClientConnection()
{
QTcpSocket *socket = server->nextPendingConnection();
connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
//...
}
void Server::readyRead()
{
QTcpSocket *clientSocket = qobject_cast<QTcpSocket *>(sender());
if (clientSocket == 0) {
return;
}
QDataStream in(clientSocket);
if (sizeMessageClient == 0)
{
if (clientSocket->bytesAvailable() < (int)sizeof(quint16)){
return;
}
in >> sizeMessageClient;
}
if (clientSocket->bytesAvailable() < sizeMessageClient) {
return;
}
sizeMessageClient = 0;
in >> data;
/*
I don't know the type of the received data !!
- if I receive string => call function showData(QString data);
- if I receive file => call function saveFile(QFile file);
- if I receive audio stream => play audio stream
- ...
*/
}
КЛИЕНТ:
Client::Client()
{
socket = new QTcpSocket(this);
connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
sizeMessageServer = 0;
}
void Client::readyRead()
{
QDataStream in(socket);
if (sizeMessageServer == 0)
{
if (socket->bytesAvailable() < (int)sizeof(quint16)) {
return;
}
in >> sizeMessageServer;
}
if (socket->bytesAvailable() < sizeMessageServer) {
return;
}
int messageReceived;
in >> messageReceived;
messageReceived = static_cast<int>(messageReceived);
sizeMessageServer = 0;
switch(messageReceived)
{
case 1:
qDebug() << "send a File";
sendFile();
break;
case 2:
qDebug() << "send a string data";
sendStringData();
break;
case 3:
qDebug() << "stream audio to the server";
streamAudioToServer();
break;
case n:
// ...
}
}
Я не ищу для полного решения, все, что я ищу некоторые рекомендации в правильном направлении ,
Похоже, вам нужно придумать (или использовать существующий) * протокол *, который может сказать вам, какие данные вы передаете. –
Я не могу найти в сети какой-либо пример того, как я могу это сделать .. –
Как минимум, вы можете упаковать тип и значение в сообщении, а затем на конечный выключатель приема на тип. –