天天看點

QT類似于QQ的即時聊天程式用開發QTcpServer,QTcpSocket簡單開發

時間不代表你擁有多少,而在于你如何實用。

好了正文開始:

----------------------------------------------------------------------------------------------------------華麗的分割線-----------------------------------------------------------------------------------------------------------

前方高能注意:

以下是QT伺服器開啟代碼:

[cpp]  view plain  copy

  1. tcpServer = new QTcpServer(this);  

[cpp]  view plain  copy

  1. if (!tcpServer->listen(QHostAddress::Any, 23333)) {  
  2.         QMessageBox::critical(this, tr("Fortune Server"),  
  3.             tr("Unable to start the server: %1.")  
  4.             .arg(tcpServer->errorString()));  
  5.         close();  
  6.         return;  
  7.     }  

這段代碼的意思是, [cpp]  view plain  copy

  1. tcpServer = new QTcpServer(this);  

執行個體化伺服器,

[cpp]  view plain  copy

  1. tcpServer->listen(QHostAddress::Any, 23333)這段代碼的意思是監聽23333端口,失敗了就列印一些資料并關閉端口  

[cpp]  view plain  copy

  1. connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendServerData()));這段代碼的意思是如果有新的連接配接就通知插槽sendServerData  

讓我們開看看 sendServerData

[cpp]  view plain  copy

  1. //伺服器向每個連結的使用者發用資料驗證  
  2. void ChatServer::sendServerData()  
  3. {   
  4.     QTcpSocket *clientConnection = tcpServer->nextPendingConnection();   
  5.     QString uuidStr = getSocketUUID();   
  6.     QString serverDataStr = sendClientUUID(uuidStr).toUtf8().data();;  
  7.     int dataSize = serverDataStr.length();   
  8.     QByteArray block;  
  9.     QDataStream out(&block, QIODevice::WriteOnly);  
  10.     out.setVersion(QDataStream::Qt_4_0);   
  11.     out << (quint16)dataSize;  
  12.     out << 0;  
  13.     out << serverDataStr;  
  14.     out.device()->seek(0);  
  15.     clientConnection->write(block);  
  16.     clientConnection->flush();   
  17.     connect(clientConnection, SIGNAL(disconnected()),clientConnection, SLOT(deleteLater()));   
  18.     connect(clientConnection, SIGNAL(disconnected()), this, SLOT(disconnectDispose()));  
  19.     connect(clientConnection, SIGNAL(readyRead()), this, SLOT(readMessage()));   
  20.     connectNumber += 1;  
  21.     connectTextlabel->setText(QStringLiteral("%1").arg(connectNumber));   
  22. }   

可以看到,每個新的連接配接都會被輸出一個UUID,其實qt的socket封裝的很好,比如我們這裡輸出的資料

[cpp]  view plain  copy

  1. QByteArray block;  
  2.     QDataStream out(&block, QIODevice::WriteOnly);  
  3.     out.setVersion(QDataStream::Qt_4_0);   
  4.     out << (quint16)dataSize;  
  5.     out << 0;  
  6.     out << serverDataStr;  
  7.     out.device()->seek(0);  
  8.     clientConnection->write(block);  
  9.     clientConnection->flush();   

輸出,也就是out,第一個是 quint16的整形資料,第二個是 int資料為0,但三個是一個 QString資料然後out把輸出的索引設定為0原因,輸出時需要從0開始

,否則直接就讀到最後一位了,因為 開始寫資料的時候<<seek自動移動到最後一位,是以需要重置他為0。

----------------------------------------------------------------------------------------------------------------用戶端連接配接------------------------------------------------------------------------------------------------------

以下是用戶端的連接配接方法

[cpp]  view plain  copy

  1. qtcpSocket = new QTcpSocket(this);   
  2. qtcpSocket->abort();  
  3. qtcpSocket->connectToHost("119.29.202.212", 23333);//IP位址需要看你的電腦是多少,如果是本機就是127.0.0.1,  

這就是用戶端連接配接到伺服器的代碼,

以下是用戶端讀取伺服器端的資料

[cpp]  view plain  copy

  1. QDataStream  in(qtcpSocket);   
  2.     in.setVersion(QDataStream::Qt_4_0);  
  3.     in >> blockSize;//從in中讀取資料到<span style="font-family: Arial, Helvetica, sans-serif;">blockSize</span>  
  4.     in >> DATA_EMENU;<span style="font-family: Arial, Helvetica, sans-serif;">//從in中讀取資料到</span><span style="font-family: Arial, Helvetica, sans-serif;">DATA_EMENU</span>  
  5.     QString serverStatus ;  
  6.     in >> serverStatus; <span style="font-family: Arial, Helvetica, sans-serif;">//從in中讀取資料到serverStatus</span><div>  
  7. </div>  

用戶端讀取,資料的 步驟需要按照伺服器發送資料的步驟嚴格讀取,否則,将讀取不到資料, 可能是QTsocket的保護機制吧

--------------------------------------------------------------------------------------------------------華麗發的分割線--------------------------------------------------------------------------------------------------------

以下是部落客做的一個類似于QQ的qtSocket聊天程式的截圖和源代碼:

用戶端啟動圖:

QT類似于QQ的即時聊天程式用開發QTcpServer,QTcpSocket簡單開發

用戶端登入圖:

QT類似于QQ的即時聊天程式用開發QTcpServer,QTcpSocket簡單開發

用戶端聯系人截圖:

QT類似于QQ的即時聊天程式用開發QTcpServer,QTcpSocket簡單開發

用戶端聊天截圖:

QT類似于QQ的即時聊天程式用開發QTcpServer,QTcpSocket簡單開發

用戶端添加好友截圖:

QT類似于QQ的即時聊天程式用開發QTcpServer,QTcpSocket簡單開發

----------------------------------------------------------------------------------------------------------------end-----------------------------------------------------------------------------------------------------------

附上伺服器和用戶端的位址:http://download.csdn.net/detail/li491093957/9655803

-----------------------------------------------------------------------------------------------

-

-

-

繼續閱讀