QSocket和QDataStream通訊
QSocket和QDataStream通訊
1.需求
兩個程式的通訊,但是通訊的過程的資料量大並且含有複雜的結構體(包含4層)。
2.過程
方法一:直接通過拆分構體,多次傳送資料,在接收端接收資料組合結構體。因為多次傳送無法保證接收的先後性,導致下一步的結構體拼接受到影響。(放棄)
方法二:通過QIODevice繫結一個socket,在接收端直接拿資料。可以使用,但是當傳送資料量大時候,提前相應接收資料。(放棄)
方法三:還是通過流來傳輸,只不過是將複雜的結構體拆分為簡單型別存入流,流再寫入QByetArray中傳送,然後接收到後按同樣的方式讀取。(可行)
3.結論
不多BB,程式碼思路如下。
//結構體:
打工人
{
QString Name;
QList<QString> Deposit_Banks;
};
人上人
{
QString Name;
QVector<打工人> Workers;
};
//傳送端:
sendPoint{
人上人 真人上人;
QByteArray byts;
QDataStream stream(&byts, QIODevice::WriteOnly);
stream << (quint32)0x22;//頭的標誌
stream << 真人上人.Name
<< 真人上人.Workers.size();
for (int i = 0; i < 真人上人.Workers.size().i++)
{
打工人 worker = 真人上人.Workers.at(i);
stream << worker.Name
<< worker.Deposit_Banks.size();
for (int k = 0; k < worker.Deposit_Banks.at(i); k++)
{
stream << k < worker.Deposit_Banks.at(i).at(k);
}
}
Socket.write(byts);
}
//接收端:
receivePoint{
QByteArray byts = Socket->readAll();
QDataStream stream(&byts, QIODevice::ReadOnly);
int head;
stream >> head;
if (head == 0x22)
{
人上人 真人上人;
stream >> 真人上人.Name;
int count;
stream >> count;
for (int i = 0; i < count; i++)
{
打工人 Worker;
stream >> Worker.Name;
int banks;
stream >> banks;
for (int k = 0; k < banks; k++)
{
QString bankName;
stream >> bankName;
Worker.Deposit_Banks.push_back(bankName);
}
真人上人.Workers.push_back(Worker);
}
}
}
4.注意
主要傳送端和接收端流的型別的一致性,什麼型別打包,什麼型別解包。
當前版本 Qt4和vs開發。
相關文章
- 同步通訊和非同步通訊非同步
- 簡單區分WiFi通訊和WLAN通訊WiFi
- RabbitMQ 入門(一)同步通訊和非同步通訊MQ非同步
- 分散式入門(一)- 通訊原語和通訊庫分散式
- 通訊錄查詢和新增
- BMS和AFE通訊問題
- JAVA通訊(二)——實現客戶機和伺服器通訊Java伺服器
- 音視訊通訊——直播協議和視訊推流協議
- 物聯網通訊與普通簡訊通訊的區別和要注意的地方
- 程序間的通訊(訊號通訊)
- UIWebView中Objective C和JavaScript通訊UIWebViewObjectJavaScript
- Java基礎(Socket通訊和NIO)Java
- JavaScript和Macromedia Flash的通訊示例JavaScriptMac
- 元件間通訊provide和inject元件IDE
- 在Go和Python之間通過ActiveMQ通訊GoPythonMQ
- 樂訊通雲通訊:物聯網路卡和手機卡的區別
- RabbitMQ實戰:訊息通訊模式和最佳實踐MQ模式
- 程式通訊 執行緒通訊執行緒
- 【React】元件通訊 - 跨層通訊React元件
- 劍走偏鋒之Vue 元件通訊(一)—通過$parent和$children構建自己的通訊方式Vue元件
- 元件生命週期管理和通訊方案元件
- Tcp, WebSocket 和 http 之間的通訊TCPWebHTTP
- 網路和通訊安全有哪些要求?
- Nginx和php是怎麼通訊的?NginxPHP
- C++和pascal之間的通訊C++
- smack和openfire通訊的簡單例子Mac單例
- applet 和servlet通訊問題APPServlet
- Application和servlet間通訊問題APPServlet
- Linux 下的程式間通訊:套接字和訊號Linux
- 程序通訊-訊號
- 程序通訊--訊號
- 網路通訊2:TCP通訊實現TCP
- 網路通訊3:TCP互動通訊TCP
- 網路通訊2:TCP簡單通訊TCP
- 紅色通訊史(三):延安通訊故事
- Binder通訊機制與IPC通訊.md
- Qt中對js和HTML通訊的理解QTJSHTML
- Java 和 Python 之間的 Socket 通訊JavaPython