1. 程式人生 > >使用Qt開發中國象棋(七):網路對戰

使用Qt開發中國象棋(七):網路對戰

關於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提供的類要方便得多。