2017-10-20 125 views
0

我是網絡和互聯網領域的新手,因此想道歉可能是愚蠢的問題。我不明白是否有其他方式將數據從客戶端套接字發送到服務器的axcept使用方法QIODevice::write(QByteArray&)將數據放入流中。如果這是服務器應該如何識別已發送數據的唯一方式?例如,我們可能會將QString消息作爲通常的輸入數據,但有時也會將QString作爲未來數據的進一步接收者的名稱。可以描述所有變體,但是在這種情況下,連接到readyRead()信號的插槽似乎具有巨大的尺寸 。Qt,客戶端 - 服務器關係

最後,有沒有辦法將數據引導到某個確切的服務器功能?

+1

我不太確定你的問題是什麼,但在我看來,你似乎在設計*協議*。即某種方式說「此消息包含此數據」和「此其他消息包含其他數據」。 –

+1

您的服務器和客戶端需要知道如何通信。也就是說,他們必須就一個通用的協議達成一致 - 比如「我總是會發送兩個字節來識別將要發生的事情的類型,然後我會發送4個字節來表示'事情'的大小,然後數據將會跟隨」;那麼你會回覆「我們已經同意的形式的東西」等 - 或類似的東西..你不能只是發送任意的「東西」,並期望另一端猜測它是什麼。 –

+0

@JesperJuhl所以協議只是關於數據如何識別的規則和描述的集合? –

回答

0

Qt的解決方案有一個圖書館,使輕鬆的Qt服務器:

Qt Solutions

和JSON格式,它是溝通

0

您需要定義comman數據類型兩側(客戶端一個美麗的方式和服務器)。在發送數據包之前,您應該將數據包的大小寫入數據包的前四個字節。在服務器端檢查從前四個字節的客戶端接收數據的大小。並反序列化你在客戶端如何序列化的數據。我長時間使用這種方法,並且今天出現了任何問題。我會爲你提供示例代碼。

客戶端:

QBuffer buffer; 
buffer.open(QIODevice::ReadWrite); 
QDataStream in(&buffer); 
in.setVersion(QDataStream::Qt_5_2); 
in << int(0); // for packet size 
in << int(3); // int may be this your data type or command 
in << double(4);   // double data 
in << QString("asdsdffdggfh"); // 
in << QVariant(""); 
in << .... // any data you can serialize which QDatastream accept 
in.device()->seek(0);     // seek packet fisrt byte 
in << buffer.data().size();    // and write packet size 
array = buffer.data(); 

this->socket->write(arr); 
this->socket->waitForBytesWritten(); 

服務器端:

QDatastream in(socket); 

//define this out of this scope and globally 
int expectedByte = -1; 



if(expectedByte < socket->bytesAvailable() && expectedByte == -1) 
{ 
    in >> expectedByte; 
} 

if(expectedByte - socket->bytesAvailable()- (int)sizeof(int) != 0){ 
    return; 
} 

// if code here, your packet received completely 
int commandOrDataType; 
in >> commandOrDataType; 
double anyDoubleValue; 
in >> anyDoubleValue; 
QString anyStringValue; 
in >> anyStringValue; 
QVariant anyVariant; 
in >> anyVariant; 
// and whatever ... 

// do something with above data 


//you must set expectedByte = -1; 
// if your proccessing doing any thing at this time there is no any data will be received while expectedByte != -1, but may be socket buffer will be filling. you should comfirm at the begining of this function 
expectedByte = -1; 

希望這會很有幫助! :)