一個輕量級程式庫,可讓您透過 TCP 或 UDP 發送和接收物件。 ObjectTranport 的目標是成為一個盡可能簡單、輕量級的網路框架。
有多種序列化選項可用,例如 Protobuf。序列化是可注入的,您可以實現自己的序列化。
ObjectTransport 依您的需求分為單獨的包,並可在 nuget 上使用。請參閱安裝說明以了解更多詳細資訊:https://github.com/RhynoVDS/ObjectTransport/wiki/Installation
您可以使用以下程式碼啟動 TCP 伺服器:
var server = ObjectTransport . Factory . CreateTCPServer ( )
. UseJSONserialization ( ) ;
. Build ( ) ;
//Start the TCP server on port 123
server . Start ( "127.0.0.1" , 123 ) ;
或者你可以啟動一個UDP伺服器
var server = ObjectTransport . Factory . CreateUDPServer ( )
. UseJSONserialization ( ) ;
. Build ( ) ;
//Start the UDP server on port 123
server . Start ( "127.0.0.1" , 123 ) ;
在此範例中,我們有一個場景,我們想要處理登入伺服器的使用者。假設我們有一個名為「LoginModel」的簡單類別。目前這個類別只有「使用者名稱」字段
public class LoginModel
{
public string Username { get ; set ; }
}
我們希望伺服器接收這個物件並處理它。這可以使用“接收”功能來完成:
server . Receive < LoginModel > ( lm =>
{
Console . WriteLine ( lm . Username ) ;
} )
. Execute ( ) ;
在上面的程式碼中,我們指定當伺服器接收到「LoginModel」類型的物件時,執行給定的 lambda。然後我們將用戶名寫入控制台。
可以設定多個接收函數並處理其他類型:
server . Receive < LoginModel > ( lm => .. . ) . Execute ( ) ;
server . Receive < LogOutModel > ( lm => .. . ) . Execute ( ) ;
server . Receive < PlayerPosition > ( lm => .. . ) . Execute ( ) ;
.. .
您可以使用以下程式碼啟動 TCP 用戶端:
var client = ObjectTransport . Factory . CreateTCPClient ( )
. UseJSONserialization ( ) ;
. Build ( ) ;
//Start the client and connect to the target IP address and port
client . Start ( "10.0.0.1" , 123 ) ;
若要透過通道傳送對象,請使用「傳送」函數:
var loginRequest = new LoginModel ( )
loginRequest . Username = "TestUser" ;
client . Send ( loginRequest ) . Execute ( ) ;
在下面的範例中,我們將展示伺服器/客戶端如何回覆接收的物件。
在前面的範例中,我們目前正在向伺服器發送使用者名,但沒有發送密碼,這不太安全。在此範例中,我們更新模型以具有“密碼”欄位:
public class LoginModel
{
public string Username { get ; set ; }
public string Password { get ; set ; }
}
我們的客戶端需要向伺服器發送登入請求,現在還需要發送密碼。因此,我們希望處理對我們請求的任何回應,包括登入是否成功。為了處理這個問題,我們建立兩個新類別「LoginSuccess」和「LoginFailure」。
public class LoginSuccess
{
public string Name { get ; set ; }
public string Password { get ; set ; }
}
public class LoginFailure
{
public string Message { get ; set ; }
}
在我們的客戶端程式碼中,我們現在將在發送登入物件後使用“Response”函數。當伺服器回覆發送的物件時,客戶端將處理它的回應:
var transport = ObjectTransport . Factory . CreateTCPClient ( "10.0.0.1" , 123 ) ;
var loginRequest = new LoginModel ( ) ;
loginRequest . Username = "TestUser" ;
loginRequest . Password = "A password" ;
transport . Send ( loginRequest )
. Response < LoginSuccess > ( ls => {
Console . WriteLine ( "Welcome Back {0}" , ls . Name ) ;
} )
. Response < LoginFailure > ( lr => {
Console . WriteLine ( lr . Message )
} )
. Execute ( ) ;
在上面的範例中,我們設定了 2 個回應句柄,一個用於處理“LoginSuccess”,另一個用於處理“LoginFailure”。
在伺服器上,我們將在收到登入模型後使用「回覆」功能。當使用這個函數時,我們需要使用一個函數/lambda,它將「傳回」一個將被發回的物件:
server . Receive < LoginModel > ( )
. Reply ( lr => {
string user = string . empty ;
//Check if login is valid
if ( utilities . Login ( lr , out user ) )
{
//Return an object back to the client
var response = new LoginSuccess ( ) ;
response . Message = "Login Successful" ;
response . Name = user ;
return response ;
}
else
{
//Return an object back to the client
var response = new LoginFailure ( ) ;
response . Message = "Login Failed" ;
return response ;
}
} )
. Execute ( ) ;
當連接多個客戶端時,可以使用「To」功能指定向哪個客戶端傳送訊息。您可以在「收件者」功能中指定多個用戶端。
server . Send ( anObjectToSend )
. To ( client1 , client2 , .. . ClientN )
. Execute ( ) ;
您可以使用以下方式傳送給所有客戶。
//Send to all clients
server . Send ( anObjectToSend )
. ToAll ( )
. Execute ( ) ;
//Note that you don't actually need to specify ToAll anymore. By default the API will send to all
您也可以傳送給所有客戶端並指定要排除的物件:
//Send to all clients except client 3
server . Send ( anObjectToSend )
. ToAllExcept ( client3 ) //Can exclude more eg: .ToAllExcept(client3,client2, ... clientN)
. Execute ( ) ;
您可以指定當有人連接或斷開連接時應該發生什麼:
//Setup onconnect handler
transport . OnClientConnect ( c => Console . WriteLine ( "A client has connected with ip {0}" , c . IPAddress ) ) ;
//Setup onDisconnect handler
transport . OnClientDisconnect ( c => Console . WriteLine ( "A client has disconnected with ip {0}" , c . IPAddress ) ) ;
透過 UDP 發送物件時,訊息的發送不可靠。您可以透過以下方式可靠地開啟 UDP:
client . SetReliable ( ) ;
執行完上面這行之後,所有發送的物件都會被可靠地發送。
另一種選擇是僅可靠地發送特定訊息。下圖證明了這一點:
client . Send ( anObjectToSend )
. Reliable ( ) ;
. Execute ( ) ;
若要中斷一個或多個客戶端與伺服器的連接,可以使用 DisconnectClient 函數:
server . DisconnectClient ( client1 , client2 , .. . clientN ) ;