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」のオブジェクトを受信したときに、指定されたラムダを実行するように指定しています。次に、ユーザー名をコンソールに書き込みます。
複数の受信関数を設定し、他のタイプを処理することが可能です。
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 ; }
}
クライアントはログインリクエストをサーバーに送信する必要があり、パスワードも送信する必要があります。このため、ログインが成功したかどうかを含め、リクエストに対するあらゆる応答を処理したいと考えています。これに対処するために、2 つの新しいクラス「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 つの応答ハンドルを設定し、1 つは「LoginSuccess」を処理し、もう 1 つは「LoginFailure」を処理します。
サーバー上では、ログインモデルを受信した後、「返信」機能を使用します。この関数を使用するときは、送り返されるオブジェクトを「返す」関数/ラムダを使用する必要があります。
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」機能を使用してどのクライアントにメッセージを送信するかを指定することができます。 「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 ( ) ;
上記の行を実行すると、送信されるすべてのオブジェクトが確実に送信されます。
もう 1 つのオプションは、特定のメッセージのみを確実に送信することです。以下はこれを示しています。
client . Send ( anObjectToSend )
. Reliable ( ) ;
. Execute ( ) ;
1 つ以上のクライアントをサーバーから切断するには、DisconnectClient 関数を使用できます。
server . DisconnectClient ( client1 , client2 , .. . clientN ) ;