伺服器和客戶端

啟動伺服器

要啟動伺服器,首先需要取得伺服器對象,如下例所示。 伺服器建立後,不會立即建立與客戶端或執行緒池的通信,因此必須透過在建立的物件上呼叫 Start 來運行伺服器。

1. 創建伺服器

m_netServer = Proud::CNetServer::Create();
// 可以使用delete運算子刪除已修復的物件。
delete m_netServer;

在啟動伺服器之前,請務必檢查伺服器的伺服器的UDP連接埠類型

2. 準備

// 將 ProudNet 進行 include 。
#include “include\ProudNetServer.h”
  
// 在 ProudNet 中,所有物件都被分組到一個名為 Proud 的namespace中。
using namespace Proud;
  
// port 定義
int g_ServerPort = 33334;

3. 啟動伺服器

先建立一個伺服器對象,然後呼叫SetEventSink函數。 這是註冊對像以接收伺服器上發生的事件的回調的過程。 如果將指針傳遞給透過繼承 INetServerEvent 物件建立的對象,伺服器將透過該物件回呼事件。

從 C++11 開始,可以使用 lambda 而不是 SetEventSink 來註冊事件。

// 請僅參考 C++11 之前的版本。
// g_eventSink是繼承INetServerEvent的物件。
CNetServer* srv = 
         Proud::CNetServer::Create();
srv->SetEventSink(
         &g_eventSink);
  
// 設定啟動伺服器所需的參數。
CStartServerParameter p1;
 
// 接收Client端Connection的Port
p1.m_tcpPort = 33334;  
  
srv->Start(p1);

💡在上面的程式碼範例中,g_eventSink 是使用下列結構建立的物件。

// 如何建立一個物件來接收來自 CNetServer 的事件
Class CServerEventSink 
         : public INetServerEvent 
{
       // 當客戶端連線完成時 
       // 會發生回呼。
       // 它接收 CNetClientInfo 物件作為參數。
       Virtual void OnClientJoin(
           CNetClientInfo *info) 
           OVERRIDE
       {
           // 我們接收 
           // 並處理客戶的資訊。
       }
       // 當客戶端斷開連線時 
       // 會發生回呼。
           Virtual void OnClientLeave(
               CNetClientInfo *info) 
               OVERRIDE
       {
               // 我們接收 
               // 並處理客戶的資訊。
       }
       // 其餘事件省略。
}

CNetClientInfo物件包含連線的客戶端訊息,CNetClientInfo的成員m_HostID是可以識別每個主機的ID值。

💡C# 中的 NetClientInfo 與 C++ 中的 CNetClientInfo 的作用相同。

4. 解除連接

函數註釋

Stop

伺服器停止了。 斷開所有連線。

CloseConnection(Client的 HostID)

中斷與對應客戶端的連線。

5. 開始接收客戶端連接

為了接收來自伺服器的客戶端連接,需要在伺服器端準備一個Listening Port和執行緒池。 為此,我們需要建立一個 Server 對象,然後呼叫其 Start 方法。

開始使用客戶端

與伺服器一樣,客戶端也可以在建立物件後連接到伺服器。

1. 創建客戶端

m_netClient = Proud::開始接收客戶端連接CNetClient::Create();

2. 準備

// 設定連接伺服器所需參數
Proud::CNetConnectionParam cp;

// 您必須輸入與伺服器相同的協定版本。 您可能根本不輸入它。
cp.m_protocolVersion = g_version;
cp.m_closeNoPingPongTcpConnections=false;
cp.m_serverIP = _PNT("localhost");
cp.m_serverPort = 33334;	

3. 開始

// 使用上面準備範例中建立的參數。
m_netClinet->Connect(cp);

客戶端連接到伺服器時發生的事件

  • 當執行 Connect 時,OnConnectionRequest 到達伺服器,您可以在其中拒絕用戶端嘗試連線。

  • 如果您在 OnConnectionRequest 中接受客戶端連接,則所有連接過程都會完成,並且將從客戶端和伺服器接收事件,如下面的程式碼範例所示。

// 在伺服器上
m_netServer->OnClientJoin = [](CNetClientInfo *clientInfo){
    // 加入客戶端時要執行的邏輯
};

// 來自客戶
m_netClient->OnJoinServerComplete = [&](ErrorInfo *info, const ByteArray &replyFromServer) {
    // 伺服器連線完成後執行的邏輯
}

4. 解除連接

// 與伺服器斷開連接
m_netClient->Disconnect();


活用

如何使用伺服器如何使用客戶端

Last updated