定時器循環、RMI、事件處理
根據客戶端的主循環,客戶端可以定期呼叫FrameMove來執行累積的RMI接收並處理事件處理。
您不一定要每秒調用FrameMove,但如果太長時間不調用,從客戶端接收到的RMI就會累積並增加記憶體使用量。
獲取各種資訊
客戶端可以檢索各種訊息,例如P2P群組資訊、P2P連線的客戶端的IP資訊、與伺服器的連線狀態以及是否正在與P2P連線的客戶端執行P2P中繼。
| C++ 函數 | C# 函數 | 註釋 |
|---|---|---|
Proud.CNetClient.GetGroupMembers | Nettention.Proud.NetClient.NativeNetClient.GetGroupMembers | 檢索與作為參數給出的 HostID 對應的群組中的所有使用者。 |
Proud.CNetClient.GetIndirectServerTimeMs | Nettention.Proud.NetClient.NativeNetClient.GetIndirectServerTimeMs | 取得以 HostID 為參數輸入的對等方的伺服器時間。 |
Proud.CNetClient.GetLastUnreliablePingMs | Nettention.Proud.NetClient.GetLastUnreliablePingMs | 取得以 HostID 為參數輸入的對等方的最後 ping 時間。 |
Proud.CNetClient.GetLocalHostID | Nettention.Proud.NetClient.GetLocalHostID | 取得客戶端的本機 HostID。 |
Proud.CNetClient.GetLocalJoinedP2PGroups | Nettention.Proud.NetClient.GetLocalJoinedP2PGroups | 取得所有加入的 p2p 群組的清單。 |
Proud.CNetClient.GetP2PServerTimeMs | Nettention.Proud.NetClient.NativeNetClient.GetP2PServerTimeMs | 取得 p2p 連線伺服器的時間(以毫秒為單位)。 |
Proud.CNetClient.GetPeerInfo | Nettention.Proud.NetClient.GetPeerInfo | 取得有關連接到客戶端的對等點的資訊。 |
Proud.CNetClient.GetPeerReliableUdpStats | Nettention.Proud.NetClient.NativeNetClient.GetPeerReliableUdpStats | 取得 P2P 之間可靠的訊息系統運行統計資料。 (用於效能測量或調試) |
Proud.CNetClient.GetRecentUnreliablePingMs | Nettention.Proud.NetClient.GetRecentUnreliablePingMs | 傳回最近的 ping 時間(以毫秒為單位)。 |
Proud.CNetClient.GetServerAddrPort | Nettention.Proud.NetClient.NativeNetClient.GetServerAddrPort | 取得連接的伺服器的位址。 |
Proud.CNetClient.GetServerConnectionState | Nettention.Proud.NetClient.GetServerConnectionState | 取得與伺服器的套接字連線的狀態。 |
Proud.CNetClient.GetServerTimeMs | Nettention.Proud.NetClient.NativeNetClient.GetServerTimeMs | 取得伺服器上的當前時間。 |
Proud.CNetClient.GetServerTimeDiffMs | Nettention.Proud.NetClient.NativeNetClient.GetServerTimeDiffMs | 找出客戶端和伺服器之間的時間差。 |
伺服器連接期間發送和接收自訂數據
當您在 Connect 中填寫自訂欄位參數時, 內容是從 OnConnectionRequest 接收的。
如果在OnConnectionRequest中填入自訂回覆參數, 內容是從 OnJoinServerComplete 接收的。

取得打孔地址
首先,完成P2P通訊。
使用 GetPeerInfo 或 GetClientInfo 取得客戶端資訊。
取得到的資訊中的udpAddrFromServer為打洞位址。
參考 P2P 通訊
取得伺服器時間
ProudNet可讓您從伺服器取得時間以實現主機之間的時間同步。
| C++ 函數 | C# 函數 | 註釋 |
|---|---|---|
Proud.CNetClient.GetServerTimeMs | Nettention.Proud.NetClient.GetServerTimeMs | 與伺服器計算延遲以獲得伺服器的實際時間。 |
Proud.CNetClient.GetP2PServerTimeMs | Nettention.Proud.NativeNetClient.GetP2PServerTimeMs | 一種取得伺服器延遲、計算其他 P2P 連線客戶端延遲並取平均值的方法。 更準確地說,您可以獲得伺服器上的實際時間。 |
回呼中途斷開
當呼叫 FrameMove 時,將立即呼叫所有累積的事件和接收到的 RMI。
如果使用者願意,ProudNet 能夠在單一 FrameMove 呼叫部分的處理過程中傳回累積事件和接收到的 RMI。 然後,它允許在下一個 FrameMove 呼叫中處理剩餘的累積事件和接收到的 RMI。
若要終止剩餘的累積事件和接收的 RMI,請從正在處理 RMI 接收的例程或正在處理事件接收的例程呼叫 HolsterMoreCallbackUntilNextFrameMove。
C++
DEFRMI_TestS2C_Foo(CMyClient)
{
...
/* 當您呼叫此函數時,CNetClient.FrameMove 立即傳回,
忽略任何剩餘的累積事件和 RMI 接收。 */
m_netClient->HolsterMoreCallbackUntilNextFrameMove();
}
void CMyClient::OnLeaveServer(...)
{
...
/* 當您呼叫此函數時,CNetClient.FrameMove 立即傳回,
忽略任何剩餘的累積事件和 RMI 接收。 */
m_netClient->HolsterMoreCallbackUntilNextFrameMove();
}C#
simpleStub.Test = (remote, rmiContext, text) => {
...
/* 當您呼叫此函數時,CNetClient.FrameMove 立即傳回,
忽略任何剩餘的累積事件和 RMI 接收。 */
netClient.HolsterMoreCallbackUntilNextFrameMove();
}
netClient.LeaveServerHandler = (errInfo) => {
...
/* 當您呼叫此函數時,CNetClient.FrameMove 立即傳回,
忽略任何剩餘的累積事件和 RMI 接收。 */
netClient.HolsterMoreCallbackUntilNextFrameMove();
}
參考
保留回呼
當各種事件和RMI接收被FrameMove回調時,有一個函數允許稍後再次發生所需的回調,稱為保留回呼。 如果您暫停回調,則待處理的回呼將轉到累積接收佇列的後面,並且下次呼叫 FrameMove 時回呼會再次發生。
例如,如果您按住Callback B,則回調將執行如下所示。
FrameMove => Callback A => Callback B (保留!) => 返回
FrameMove => Callback B(回放被擱置的內容) => ... => 返回
如果這個回呼函數沒有被準確理解和誤用,可能會被誤解為接收到的RMI或事件沒有按正確的順序到達或發生無限回呼。 因此,使用時需謹慎。
若要掛起回調,只需從處理 RMI 接收的程式或處理事件接收的例程中呼叫 Proud.INetClientEvent.PostponeThisCallback 或 Proud.IRmiStub.PostponeThisCallback 即可。
DEFRMI_TestS2C_Foo(CMyClient)
{
...
/* 當您呼叫此函數時,CNetClient.FrameMove 立即傳回,
忽略任何剩餘的累積事件和 RMI 接收。 */
PostponeThisCallback();
}
void CMyClient::OnLeaveServer(...)
{
...
/* 當您呼叫此函數時,CNetClient.FrameMove 立即傳回,
忽略任何剩餘的累積事件和 RMI 接收。 */
PostponeThisCallback();
}