使用Qt開發中國象棋(七):網路對戰
阿新 • • 發佈:2019-02-11
關於Qt網路程式設計
QTcpServer用於建立TCP伺服器端。當newConnection訊號激發時,我們呼叫指定的槽建立一個通訊的套接字。
QTcpSocket用於建立TCP通訊套接字。當connected訊號激發時,我們向伺服器端傳送訊息,當readyRead訊號激發時,我們就可以讀取資料了。
本程式中網路對戰的實現
本程式封裝了QTcpServer和QTcpSocket來實現網路對戰的功能。伺服器端實現類為ServerNetwork,客戶端實現類為ClientNetwork。整個流程大致如下:
(1)伺服器端監聽套接字。
void ServerNetwork::initServer(int port)
{
server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()), this, SLOT(newConnection()));
if(!server->listen(QHostAddress::Any, port))
{
QMessageBox::critical(NULL, tr("錯誤資訊"), tr("監聽埠失敗!"));
}
}
(2)客戶端連線伺服器。
void ClientNetwork::initClient(QString serverIP, int port)
{
clientSocket = new QTcpSocket();
connect(clientSocket, SIGNAL(connected()), this, SLOT(connected()));
connect(clientSocket, SIGNAL(disconnected()),this, SLOT(disconnected()));
connect(clientSocket, SIGNAL(disconnected()), clientSocket, SLOT(deleteLater()));
connect(clientSocket, SIGNAL(readyRead()), this, SLOT(readData() ));
connect(clientSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
QHostAddress addr(serverIP);
clientSocket->connectToHost(addr, port);
}
(3)客戶端連線上伺服器後,伺服器建立與客戶端通訊的套接字,客戶端傳送請求獲取遊戲資訊。
void ServerNetwork::newConnection()
{
serverSocket = server->nextPendingConnection();
connect(serverSocket, SIGNAL(disconnected()), this, SLOT(disconnected()));
connect(serverSocket, SIGNAL(disconnected()), serverSocket, SLOT(deleteLater()));
connect(serverSocket, SIGNAL(readyRead()), this, SLOT(readData()));
emit connStateChanged(true);
}
void ClientNetwork::connected()
{
emit connStateChanged(true);
MsgReqGameInfo msg;
clientSocket->write((char *)&msg, sizeof(msg));
}
(4)雙方等待套接字上有資料可讀,並進行訊息處理。
void ClientNetwork::readData()
{
char msg[1024];
memset(msg, 0, 1024);
int len = clientSocket->read(msg, 1024);
emit processMessage(msg, len);
}
void ServerNetwork::readData()
{
char msg[1024];
memset(msg, 0, 1024);
int len = serverSocket->read(msg, 1024);
emit processMessage(msg, len);
}
整個過程還是相當簡單的。與C語言api相比,Qt提供的類要方便得多。