qint64转为qstring qt_Qt项目中TCP通信的实现方式经验总结(服务端部分)
總第20篇
本文接第19篇,繼續梳理TCP通信過程中的重要知識。本文主要系統地講解通信服務端部分,以供在以后的項目開發過程中參考。如果覺得不錯可以關注專欄 面向加薪編程C/C++ ,第一時間接收文章更新。
1.實現原理
Qt通信過程中,服務端主要是通過QTcpServer創建服務器,監聽相應的端口等待客戶端連接,當連接成功時可以獲得socket描述符,只有拿到了這個socket句柄才可以進行數據傳輸。 服務器用來檢測新連接的信號是newConnection(),在此信號對應的槽中可以對socket進行獲取并處理。具體的使用可以參考說明文檔,這里示例使用方法如下:
QTcpServer server = new QTcpServer(this); if(server->listen(QHostAddress::Any, 5566) {//監聽成功時可以綁定信號connect(server, SIGNAL(newConnection()), this, SLOT(SlotNewConnection())); } else {//監聽失敗做相應的處理 }void SlotNewConnection() //監聽成功的槽函數,綁定socket相關信號 {socket = server->nextPendingConnection();if(socket != NULL){//做相應的處理}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系統中有自帶的延時函數usleep(),在windows平臺沒有現成的延時函數可用, 這里可以自己寫一個,以便全局可調用。
void QtSleep(unsigned int msec) {QTime reach_time = QTime::currentTime().addMSecs(msec);while(QTime::currentTime()<reach_time)QCoreApplication::processEvents(QEventLoop::AllEvents, 100); }2. 傳送自定義結構體的方式
Qt中TCP通信時,傳輸數據最好的方式是使用QDataStream類將其序列化,以二進制的形式傳輸,讀取時也用同樣的數據格式,處理比較簡單,但是這其中要注意數據在傳輸的過程中所占用的字節數。具體計算方式,可以參考專欄面向加薪編程C/C++ 中的文章:在Qt中,如何用QDataStream正確操作QString數據類型 。
這里用代碼示例socket傳輸結構體鏈表的方式。
//結構體定義 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; } //下面是傳輸過程 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;//打包數據send_procedure<<qint64(_TCP_TUNE_PROCEDURE_)<<qint64(procedure_info.size())<<qint64(struct_length);if(procedure_socket->write(m_data_block)>0) //包頭發送成功{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中使用多線程有除通用方法外,還有一種最簡便的方法,即是用moveToThread()函數。在Qt內部,已經為此封裝了run()函數的事件循環,我們甚至根本不用管詳細細節,直接將對象放置進去,對象就運行到另一個線程中了。使用方法如下所示:
QThread *thread = new QThread; threads *thread_slot = new threads;//移動到另一線程 thread_slot->moveToThread(thread); thread->start();//兩個類之間的相互通信 QObject::connect(this, SIGNAL(trans_signal()), thread_slot, SLOT(th_trans_code()));本文到此結束!
如果對你有幫助,請隨手 點個贊 或 點喜歡!隨手點贊,手留余香!
=======================================================
歡迎【關注作者、私信作者】。我們一起交流一起進步。
=======================================================
總結
以上是生活随笔為你收集整理的qint64转为qstring qt_Qt项目中TCP通信的实现方式经验总结(服务端部分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直接输出代码_C语言入门 | 优秀代码(
- 下一篇: js怎么定义combobox_好程序员w