P2P 通訊

客戶端間通訊或peer-to-peer網絡(以下簡稱 P2P 通訊)是指客戶端主機之間不經過伺服器的直接通訊。

該功能在以下情況下非常有用。

  • 當資料量太大而無法透過伺服器進行通訊時

  • 當客戶端地理位置相近但伺服器距離太遠時

  • 當您希望透過在客戶端之間直接聯網而不透過伺服器來降低延遲

在層間同步移動時,可以透過使用P2P功能來減少伺服器流量。 但另一方面,隨著P2P連線數量的增加,客戶端流量可能會變得過多,並且始終存在被駭客攻擊的風險,因此也必須在伺服器上檢查是否已確定攻擊等重要資料。

為了提高針對駭客攻擊的安全性,ProudNet 在伺服器上管理一切,包括 P2P 群組的建立和發布。

要建立P2P連接,必須先在伺服器上的客戶端之間建立P2P群組。 客戶端只能與屬於同一P2P組的客戶端進行P2P通訊。

當伺服器上形成客戶端之間的P2P群組時,客戶端首先透過伺服器進行P2P中繼通訊。 同時,客戶端之間的P2P打洞是在後台進行的。 如果P2P孔穿孔成功,從那時起客戶端之間的通信將直接進行,而無需經由服務器。 這叫先打洞,後接力。 憑藉這些功能,ProudNet 允許在 P2P 群組形成或更改後立即在客戶端之間發送和接收訊息,並且 ProudNet 應用程式在啟動遊戲室時不需要等待時間。 另外,在MMORPG遊戲中,可靠地進行頻繁的P2P連接和斷開,以利用P2P來同步可見區域中的角色位置。

如果在形成P2P組後就開始客戶端之間的通信,伺服器端流量會暫時增加幾秒鐘。

打洞客戶端之間的P2P通訊使用UDP和ProudNet自研的Reliable UDP進行,但P2P中繼是透過UDP或TCP進行的,直到打洞成功。 客戶端進行P2P通訊時所使用的UDP連接埠與連接伺服器時所使用的UDP連接埠相同。

一般來說,中繼通訊的延遲是P2P通訊的兩倍以上,特別是伺服器距離越遠,差距就越大。

P2P 組

- 開設 P2P 組

要在ProudNet上與其他客戶端進行P2P通信,必須先在伺服器上開啟一個P2P群組。 如果使用 Proud.CNetServer.CreateP2PGroup 在伺服器上開啟 P2P 群組,則用戶端將收到作為 P2P 群組成員的用戶端的 HostID 的事件 Proud.INetClientEvent.OnP2PMemberJoin。 用戶端收到並處理後,伺服器將收到 Proud.INetServerEvent.OnP2PGroupJoinMemberAckComplete

當客戶端偵測到伺服器上 P2P 群組中的所有變更後想要處理其他事情時,此事件有效。

- 如何使用

1. 透過呼叫伺服器上的CreateP2PGroup函數來建立P2P組。 2. 用戶端透過 INetClientEvent::OnP2PMemberJoin 收到 P2P 群組已建立的回呼。 3. 透過OnP2PMemberJoin函數接收進入群組的客戶端和Member的HostID值。

功能回呼C++ 函數C# 函數

新增成員到P2P群組

伺服器

CNetServer::JoinP2PGroup

Nettention.Proud.NetServer.JoinP2PGroup

客戶

INetClientEvent::OnP2PMemberJoin

Nettention.Proud.NetClient.P2PMemberJoinHandler

刪除 P2P 組中的新 member

伺服器

CNetServer::LeaveP2PGroup

Nettention.Proud.NetServer.LeaveP2PGroup

客戶

INetClientEvent::OnP2PMemberLeave

Nettention.Proud.NetClient.P2PMemberLeaveHandler

刪除P2P組

伺服器

CNetServer::DestroyP2PGroup

Nettention.Proud.NetServer.DestroyP2PGroup

客戶

INetClientEvent::LeaveP2PGroup

Nettention.Proud.NetClient.LeaveP2PGroup

- 用法範例

在遊戲期間查看群組處理和聊天

函數註釋

CreateP2PGroup

客戶端連線、建立聊天群組

DestroyP2PGroup

當客戶端斷開連線並且聊天群組被刪除時

JoinP2PGroup

當另一個用戶進入視野時、當新用戶進入房間時

LeaveP2PGroup

當其他用戶消失或現有用戶離開房間時


活用

如何使用P2P通訊

Last updated