[1.6 版本] 服務器間 LAN 通訊器

LanServer, LanClient從1.7版本開始退役。 Lan Server, LanClient 的角色由 NetServer, NetClient 代替 。

參考 從ProudNet 1.6 Lan Module 遷移到 1.7 Net Module

LAN通訊器的特點

ProudNet服務器與網絡和服務器之間的LAN通信器的區別如下。

劃分ProudNet 服務器與網絡服務器間LAN通信器

主要用途

普通用戶應用程序和服務器的通信

分散式伺服器結構中各伺服器之間的通信

NAT 裝置滲透性

YES

NO

P2P relay(relay)

YES

NO

客戶端與服務器通信協議

TCP and UDP

TCP

P2P 通信協議

(Reliable) UDP

TCP

客戶回撥方式

Poll (來自Proud.CNetClient.FrameMove的回調)

從線程池回調

lan_main提供以下主機間高速通信。

  • 由於它僅使用 TCP,因此它使用伺服器硬體的通訊加速(TCP Offload Engine)。

  • Client不同,事件和接收消息會在線程池中進行回撥。 當然,服務器方也會在thread pool中發生回電。

LAN 通訊器的使用方法

ProudNet服務器和網絡以及LAN通信器的用法幾乎相同。

以下是API的差異。

劃分ProudNet 服務器與網絡服務器間LAN通信器

Server

Proud.CNetServer

Proud.CLanServer

Client

Proud.CNetClient

Proud.CLanClient

Server event handler

Proud.INetServerEvent

Proud.ILanServerEvent

Client event handler

Proud.INetClientEvent

Proud.ILanClientEvent

Message pool method

Proud.CNetClient.FrameMove

None (callback in thread pool)

LAN 通信器的 P2P 通信

Proud.CLanClient主機之間的P2P通信使用TCP協議。

Proud.CLanServer.CreateP2PGroup等實現主機間P2P通信的瞬間啓動P2P消息時,在Pier間TCP連接完成之前,想要發送的信息將保存在各主機的本地queue中。 保存的信息在TCP連接成功後立即開始傳送。

一旦 TCP 連線建立,Proud.ILanClientEvent.OnP2PConnectionEstablished, Proud.ILanServerEvent.OnP2PConnectionEstablished 就會被回調。

反之,當TCP連線中斷時,會回呼Proud.ILanClientEvent.OnP2PDisconnected, Proud.ILanServerEvent.OnP2PDisconnected

當為 P2P 群組中的所有成員建立 TCP 連線時,Proud.ILanClientEvent.OnGroupP2PConnectionComplete, Proud.ILanServerEvent.OnGroupP2PConnectionComplete 會被回呼。

LAN 通信設備上的 thread pool

Proud.CLanClient是事件回撥和RMI回撥發生在線程池的線程中。 而且這個線程池是由 Proud.CLanClient 準備的, 因此沒有對應於 Proud.CNetClient.FrameMove 的函數 。

Proud.CLanConnectionParam.m_netWorkerThreadCount 可以指定客戶機上所有線程池的線程數 。

LAN 用戶端的斷線處理

LAN 用戶端在連線程序(CLanClient.Connect)期間建立user worker thread pool,並在中斷連線程序(CLanClient.Disconnect)期間刪除該池,因此LAN 用戶端無法在user worker thread上執行中斷或連線命令。

如果實現,將會發生Proud.Exception

LAN 通信器的 RMI

RMI使用方法相同。

在服務器間通信中同步時間

從客戶端獲取服務器時間的用法相同。

從 ProudNet 1.6 Lan Module 遷移到 1.7 Net Module

- 從1.6 Lan Module變更爲1.7 Net Module時的注意事項

調用 NetClient.Connect() 需要指定 thread model 。

調用時, 您必須將參數放入 m_userWorkerThreadModel 中, 使您能夠在多個線程中接收 user 回撥 。

或者,將您建立的線程池物件附加到 m_externalUserWorkerThreadPool 參數。

這個線程池有多個線程。

void CFarmClient::Connect()
{
    CNetConnectionParam p1;
    p1.m_protocolVersion = CFarmSettings::GetSharedPtr()->GetFarmVersion();
    p1.m_serverIP = L"localhost";
    p1.m_serverPort = CFarmSettings::GetSharedPtr()->GetFarmServerPort();
    p1.m_timerCallbackIntervalMs = 1000;
 
    // 在user worker thread pool 中處理 m_lanClient 的事件 。
    // 而且爲了不需要調用FrameMove。
    p1.m_userWorkerThreadModel = ThreadModel_MultiThreaded;
 
    // outerror 指向僅當發生錯誤時在堆上指派的 ErrorInfo。
    // 如果呼叫Connect後想使用outerror,則在使用前必須檢查它是否為NULL。
    ErrorInfoPtr outerror;
    m_lanClient->Connect(p1, outerror);
}

服務器間通信時,由原來的TCP通信改爲UDP base通信,需要UDP Port相關的防火牆操作。

- 如何從 1.6 Lan Module 切換到 1.7 Net Module

  1. 準備1.7庫。 庫位於<安裝文件夾>/ProudNet/lib/中。

  2. 將函數名稱從Lan更改爲Net。 變更對象包括類、函數、方法。 因爲大部分都是1:1 matching,所以可以無太大變化地轉換。

- 將1.6 Sample/SimpleLan例題遷移到1.7的例題

  • LanCommonNetCommon

  • UUIDPNGUID

  • Guid::From(guid)Guid(guid)

  • LanServerNetServer

  • CLanServerEventSinkCNetServerEventSink

  • OVERRIDEPN_OVERRID

  • CLanServerCNetServer

  • CStartLanServerParameterStartServerParameter

  • p1.m_tcpPort = g_ServerPortp1.m_tcpPort .Add(g_ServerPort)

  • LanClientNetClient

  • CLanClientCNetClient

  • ILanClientEventINetClientEvent

  • OVERRIDEPN_OVERRID

  • CLanClient::Create()CNetClient::Create()

  • CLanConnectionParamCNetConnectionParam

  • ProudNetServer.hProudNetClient.h

Last updated