生活随笔
收集整理的這篇文章主要介紹了
Qt多线程 TCP 服务端
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Qt實現(xiàn) 多線程 TCP 服務(wù)端
因為項目中要用到TCP客戶端的并發(fā)處理,所以TCP服務(wù)端用多線程去實現(xiàn)是必要的。于是花了一大早上的時間寫了一各Demo 如圖:
主要關(guān)鍵代碼:
關(guān)于線程的處理。關(guān)于線程的理論知識,本人在上一篇《多線程簡單舉例》中已經(jīng)介紹過了,這里不多解釋了。這里重點關(guān)注run()函數(shù)的消息處理。
#include "tcpserverthread.h" serverThread
:: serverThread ( int sockDesc
, QObject
* parent
) : QThread ( parent
) , m_sockDesc ( sockDesc
)
{ connect ( this , SIGNAL ( clientconnected ( QString
) ) , this , SLOT ( connectToHost ( QString
) ) ) ; } serverThread
:: ~ serverThread ( )
{ m_socket
- > close ( ) ;
} void serverThread
:: run ( void )
{ m_socket
= new MySocket ( m_sockDesc
) ; if ( ! m_socket
- > setSocketDescriptor ( m_sockDesc
) ) { return ; } QString ip
= m_socket
- > peerAddress ( ) . toString ( ) ; int port
= m_socket
- > peerPort ( ) ; strIP
= QString ( "%1:%2" ) . arg ( ip
) . arg ( QString
:: number ( port
) ) ; emit
testsignal ( strIP
) ; emit
clientconnected ( strIP
) ; connect ( m_socket
, & MySocket
:: disconnected
, this , & serverThread
:: disconnectToHost
) ; connect ( m_socket
, SIGNAL ( dataReady ( const QString
& , const QByteArray
& ) ) , this , SLOT ( recvDataSlot ( const QString
& , const QByteArray
& ) ) ) ; connect ( this , SIGNAL ( sendData ( int , QString
, const QByteArray
& ) ) , m_socket
, SLOT ( sendData ( int , QString
, const QByteArray
& ) ) ) ; this - > exec ( ) ;
}
void serverThread
:: sendDataSlot ( int sockDesc
, QString str
, const QByteArray
& data
)
{ if ( data
. isEmpty ( ) ) { return ; } emit
sendData ( sockDesc
, str
, data
) ;
} void serverThread
:: recvDataSlot ( const QString
& ip
, const QByteArray
& data
)
{ emit
dataReady ( ip
, data
) ;
} void serverThread
:: disconnectToHost ( void )
{ emit
disconnectTCP ( m_sockDesc
, strIP
) ; m_socket
- > disconnectFromHost ( ) ; this - > quit ( ) ; } void serverThread
:: connectToHost ( QString str
)
{ emit
connectTCP ( m_sockDesc
, str
) ; }
2、tcpServer端對接入客戶端需要重寫 函數(shù)incomingConnection()
This virtual function is called by QLocalServer when a new connection is available. socketDescriptor is the native socket descriptor for the accepted connection. The base implementation creates a QLocalSocket, sets the socket descriptor and then stores the QLocalSocket in an internal list of pending connections. Finally newConnection() is emitted. Reimplement this function to alter the server’s behavior when a connection is available.
void MyTcpServer
:: incomingConnection ( int sockDesc
)
{ m_socketList
. append ( sockDesc
) ; serverThread
* thread
= new serverThread ( sockDesc
) ; connect ( thread
, SIGNAL ( connectTCP ( int , QString
) ) , m_Widget
, SLOT ( showConCont ( int , QString
) ) ) ; connect ( thread
, SIGNAL ( connectTCP ( int , QString
) ) , m_Widget
, SLOT ( showConnection ( int , QString
) ) ) ; connect ( thread
, SIGNAL ( disconnectTCP ( int , QString
) ) , m_Widget
, SLOT ( showDisconnection ( int , QString
) ) ) ; connect ( thread
, SIGNAL ( finished ( ) ) , thread
, SLOT ( deleteLater ( ) ) ) ; connect ( thread
, SIGNAL ( dataReady ( const QString
& , const QByteArray
& ) ) , m_Widget
, SLOT ( recvData ( const QString
& , const QByteArray
& ) ) ) ; connect ( m_Widget
, SIGNAL ( sendData ( int , QString
, const QByteArray
& ) ) , thread
, SLOT ( sendDataSlot ( int , QString
, const QByteArray
& ) ) ) ; thread
- > start ( ) ;
}
3、為了增加代碼的可讀性,這里新建一個類mysocket 來單獨收發(fā)數(shù)據(jù)
void MySocket
:: sendData ( int id
, QString str
, const QByteArray
& data
)
{ QString ip
= peerAddress ( ) . toString ( ) ; int port
= peerPort ( ) ; ip
= QString ( "%1:%2" ) . arg ( ip
) . arg ( QString
:: number ( port
) ) ; if ( str
== ip
) { if ( ! data
. isEmpty ( ) ) { this - > write ( data
) ; } }
} void MySocket
:: recvData ( void )
{ QString ip
= peerAddress ( ) . toString ( ) ; int port
= peerPort ( ) ; ip
= QString ( "%1:%2" ) . arg ( ip
) . arg ( QString
:: number ( port
) ) ; QByteArray data
= readAll ( ) ; emit
dataReady ( ip
, data
) ;
}
本示例下載地址:https://download.csdn.net/download/qq_21291397/12364249
總結(jié): TCP 服務(wù)端的創(chuàng)建不難,重點還是要理解多線程的那層含義。實操動手寫一寫代碼,可以提高對多線程的理解。
總結(jié)
以上是生活随笔 為你收集整理的Qt多线程 TCP 服务端 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。