日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

qint64转为qstring qt_Qt项目中TCP通信的实现方式经验总结(服务端部分)

發(fā)布時(shí)間:2025/3/20 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qint64转为qstring qt_Qt项目中TCP通信的实现方式经验总结(服务端部分) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

總第20篇

本文接第19篇,繼續(xù)梳理TCP通信過(guò)程中的重要知識(shí)。本文主要系統(tǒng)地講解通信服務(wù)端部分,以供在以后的項(xiàng)目開(kāi)發(fā)過(guò)程中參考。如果覺(jué)得不錯(cuò)可以關(guān)注專(zhuān)欄 面向加薪編程C/C++ ,第一時(shí)間接收文章更新。

1.實(shí)現(xiàn)原理

Qt通信過(guò)程中,服務(wù)端主要是通過(guò)QTcpServer創(chuàng)建服務(wù)器,監(jiān)聽(tīng)相應(yīng)的端口等待客戶(hù)端連接,當(dāng)連接成功時(shí)可以獲得socket描述符,只有拿到了這個(gè)socket句柄才可以進(jìn)行數(shù)據(jù)傳輸。 服務(wù)器用來(lái)檢測(cè)新連接的信號(hào)是newConnection(),在此信號(hào)對(duì)應(yīng)的槽中可以對(duì)socket進(jìn)行獲取并處理。具體的使用可以參考說(shuō)明文檔,這里示例使用方法如下:

QTcpServer server = new QTcpServer(this); if(server->listen(QHostAddress::Any, 5566) {//監(jiān)聽(tīng)成功時(shí)可以綁定信號(hào)connect(server, SIGNAL(newConnection()), this, SLOT(SlotNewConnection())); } else {//監(jiān)聽(tīng)失敗做相應(yīng)的處理 }void SlotNewConnection() //監(jiān)聽(tīng)成功的槽函數(shù),綁定socket相關(guān)信號(hào) {socket = server->nextPendingConnection();if(socket != NULL){//做相應(yīng)的處理}connect(socket, SIGNAL(readyRead()), this, SLOT(SlotReadSocket()));connect(socket, SIGNAL(bytesWritten(qint64)), this, SLOT(SlotBytesWritten(qint64)));connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(SlotDisplayError(QAbstractError::SocketError)));connect(socket, SIGNAL(disconnected()), this, SLOT(SlotDisconnect())); }

linux系統(tǒng)中有自帶的延時(shí)函數(shù)usleep(),在windows平臺(tái)沒(méi)有現(xiàn)成的延時(shí)函數(shù)可用, 這里可以自己寫(xiě)一個(gè),以便全局可調(diào)用。

void QtSleep(unsigned int msec) {QTime reach_time = QTime::currentTime().addMSecs(msec);while(QTime::currentTime()<reach_time)QCoreApplication::processEvents(QEventLoop::AllEvents, 100); }

2. 傳送自定義結(jié)構(gòu)體的方式

Qt中TCP通信時(shí),傳輸數(shù)據(jù)最好的方式是使用QDataStream類(lèi)將其序列化,以二進(jìn)制的形式傳輸,讀取時(shí)也用同樣的數(shù)據(jù)格式,處理比較簡(jiǎn)單,但是這其中要注意數(shù)據(jù)在傳輸?shù)倪^(guò)程中所占用的字節(jié)數(shù)。具體計(jì)算方式,可以參考專(zhuān)欄面向加薪編程C/C++ 中的文章:在Qt中,如何用QDataStream正確操作QString數(shù)據(jù)類(lèi)型 。

這里用代碼示例socket傳輸結(jié)構(gòu)體鏈表的方式。

//結(jié)構(gòu)體定義 struct ProcedureMonitorInfo {QString s_procedure_name;QString s_procedure_obj_name;QString s_station_name;QString s_station_obj_name;int n_path_id;int n_station_status; } //下面是傳輸過(guò)程 void SlotSendProcedureDataStruct(QList<ProcedureMonitorInfo> procedure_info) {QByteArray m_data_block;QDataStream send_procedure(&m_data_block, QIODevice::WriteOnly);send_procedure.setVersion(QDataStream::Qt_4_5);send_procedure<<qint64(0)<<qint64(0)<<qint64(0);send_procedure.device()->seek(0);int struct_length = 0;for(int ii=0; ii<procedure_info.size(); ++ii)struct_length +=(procedure_info.at(ii).s_procedure_name.length() + procedure_info.at(ii).s_procedure_obj_name.length()+procedure_info.at(ii).s_station_name.length()+procedure_info.at(ii).s_station_obj_name.length())*2 + 16 + 8;//打包數(shù)據(jù)send_procedure<<qint64(_TCP_TUNE_PROCEDURE_)<<qint64(procedure_info.size())<<qint64(struct_length);if(procedure_socket->write(m_data_block)>0) //包頭發(fā)送成功{for(int j = 0; j<procedure_info.size();++j){QByteArray procedure_data;QDataStream procedure(&procedure_data, QIODevice::WriteOnly);procedure.setVersion(QDataStream::Qt_4_5);procedure<<procedure_info.at(j);procedure_socket->write(procedure_data);}}m_data_block.resize(0); }

3. 多線程的使用

Qt中使用多線程有除通用方法外,還有一種最簡(jiǎn)便的方法,即是用moveToThread()函數(shù)。在Qt內(nèi)部,已經(jīng)為此封裝了run()函數(shù)的事件循環(huán),我們甚至根本不用管詳細(xì)細(xì)節(jié),直接將對(duì)象放置進(jìn)去,對(duì)象就運(yùn)行到另一個(gè)線程中了。使用方法如下所示:

QThread *thread = new QThread; threads *thread_slot = new threads;//移動(dòng)到另一線程 thread_slot->moveToThread(thread); thread->start();//兩個(gè)類(lèi)之間的相互通信 QObject::connect(this, SIGNAL(trans_signal()), thread_slot, SLOT(th_trans_code()));

本文到此結(jié)束!

如果對(duì)你有幫助,請(qǐng)隨手 點(diǎn)個(gè)贊 或 點(diǎn)喜歡!隨手點(diǎn)贊,手留余香!

=======================================================

歡迎【關(guān)注作者、私信作者】。我們一起交流一起進(jìn)步。

=======================================================

總結(jié)

以上是生活随笔為你收集整理的qint64转为qstring qt_Qt项目中TCP通信的实现方式经验总结(服务端部分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。