一个轻量级库,允许您通过 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 ) ;