時間不代表你擁有多少,而在于你如何實用。
好了正文開始:
----------------------------------------------------------------------------------------------------------華麗的分割線-----------------------------------------------------------------------------------------------------------
前方高能注意:
以下是QT伺服器開啟代碼:
[cpp] view plain copy
- tcpServer = new QTcpServer(this);
[cpp] view plain copy
- if (!tcpServer->listen(QHostAddress::Any, 23333)) {
- QMessageBox::critical(this, tr("Fortune Server"),
- tr("Unable to start the server: %1.")
- .arg(tcpServer->errorString()));
- close();
- return;
- }
這段代碼的意思是, [cpp] view plain copy
- tcpServer = new QTcpServer(this);
執行個體化伺服器,
[cpp] view plain copy
- tcpServer->listen(QHostAddress::Any, 23333)這段代碼的意思是監聽23333端口,失敗了就列印一些資料并關閉端口
[cpp] view plain copy
- connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendServerData()));這段代碼的意思是如果有新的連接配接就通知插槽sendServerData
讓我們開看看 sendServerData
[cpp] view plain copy
- //伺服器向每個連結的使用者發用資料驗證
- void ChatServer::sendServerData()
- {
- QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
- QString uuidStr = getSocketUUID();
- QString serverDataStr = sendClientUUID(uuidStr).toUtf8().data();;
- int dataSize = serverDataStr.length();
- QByteArray block;
- QDataStream out(&block, QIODevice::WriteOnly);
- out.setVersion(QDataStream::Qt_4_0);
- out << (quint16)dataSize;
- out << 0;
- out << serverDataStr;
- out.device()->seek(0);
- clientConnection->write(block);
- clientConnection->flush();
- connect(clientConnection, SIGNAL(disconnected()),clientConnection, SLOT(deleteLater()));
- connect(clientConnection, SIGNAL(disconnected()), this, SLOT(disconnectDispose()));
- connect(clientConnection, SIGNAL(readyRead()), this, SLOT(readMessage()));
- connectNumber += 1;
- connectTextlabel->setText(QStringLiteral("%1").arg(connectNumber));
- }
可以看到,每個新的連接配接都會被輸出一個UUID,其實qt的socket封裝的很好,比如我們這裡輸出的資料
[cpp] view plain copy
- QByteArray block;
- QDataStream out(&block, QIODevice::WriteOnly);
- out.setVersion(QDataStream::Qt_4_0);
- out << (quint16)dataSize;
- out << 0;
- out << serverDataStr;
- out.device()->seek(0);
- clientConnection->write(block);
- clientConnection->flush();
輸出,也就是out,第一個是 quint16的整形資料,第二個是 int資料為0,但三個是一個 QString資料然後out把輸出的索引設定為0原因,輸出時需要從0開始
,否則直接就讀到最後一位了,因為 開始寫資料的時候<<seek自動移動到最後一位,是以需要重置他為0。
----------------------------------------------------------------------------------------------------------------用戶端連接配接------------------------------------------------------------------------------------------------------
以下是用戶端的連接配接方法
[cpp] view plain copy
- qtcpSocket = new QTcpSocket(this);
- qtcpSocket->abort();
- qtcpSocket->connectToHost("119.29.202.212", 23333);//IP位址需要看你的電腦是多少,如果是本機就是127.0.0.1,
這就是用戶端連接配接到伺服器的代碼,
以下是用戶端讀取伺服器端的資料
[cpp] view plain copy
- QDataStream in(qtcpSocket);
- in.setVersion(QDataStream::Qt_4_0);
- in >> blockSize;//從in中讀取資料到<span style="font-family: Arial, Helvetica, sans-serif;">blockSize</span>
- in >> DATA_EMENU;<span style="font-family: Arial, Helvetica, sans-serif;">//從in中讀取資料到</span><span style="font-family: Arial, Helvetica, sans-serif;">DATA_EMENU</span>
- QString serverStatus ;
- in >> serverStatus; <span style="font-family: Arial, Helvetica, sans-serif;">//從in中讀取資料到serverStatus</span><div>
- </div>
用戶端讀取,資料的 步驟需要按照伺服器發送資料的步驟嚴格讀取,否則,将讀取不到資料, 可能是QTsocket的保護機制吧
--------------------------------------------------------------------------------------------------------華麗發的分割線--------------------------------------------------------------------------------------------------------
以下是部落客做的一個類似于QQ的qtSocket聊天程式的截圖和源代碼:
用戶端啟動圖:

用戶端登入圖:
用戶端聯系人截圖:
用戶端聊天截圖:
用戶端添加好友截圖:
----------------------------------------------------------------------------------------------------------------end-----------------------------------------------------------------------------------------------------------
附上伺服器和用戶端的位址:http://download.csdn.net/detail/li491093957/9655803
-----------------------------------------------------------------------------------------------
-
-
-