TCP 또는 UDP를 통해 개체를 보내고 받을 수 있는 경량 라이브러리입니다. ObjectTranport는 최대한 간단하고 가벼운 네트워크 프레임워크를 목표로 합니다.
Protobuf와 같은 여러 직렬화 옵션을 사용할 수 있습니다. 직렬화는 주입 가능하며 직접 구현할 수 있습니다.
ObjectTransport는 필요에 따라 별도의 패키지로 분할되며 너겟에서 사용할 수 있습니다. 자세한 내용은 설치 지침을 참조하세요: 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 ; }
}
우리 클라이언트는 서버에 로그인 요청을 보내야 하며 이제 비밀번호도 보내야 합니다. 이로 인해 우리는 로그인 성공 여부를 포함하여 요청에 대한 모든 응답을 처리하려고 합니다. 이를 처리하기 위해 두 개의 새로운 클래스 "LoginSuccess" 및 "LoginFailure"를 생성합니다.
public class LoginSuccess
{
public string Name { get ; set ; }
public string Password { get ; set ; }
}
public class LoginFailure
{
public string Message { get ; set ; }
}
클라이언트 코드에서는 이제 로그인 개체를 보낸 후 "응답" 기능을 사용합니다. 서버가 전송된 개체에 응답하면 클라이언트는 해당 응답을 처리합니다.
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"를 처리합니다.
서버에서는 로그인 모델을 받은 후 "응답" 기능을 사용합니다. 이 함수를 사용할 때 다시 전송될 객체를 "반환"하는 함수/람다를 사용해야 합니다.
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 ( ) ;
여러 클라이언트가 연결된 경우 "받는 사람" 기능을 사용하여 메시지를 보낼 클라이언트를 지정할 수 있습니다. "받는 사람" 기능에서 여러 클라이언트를 지정할 수 있습니다.
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 ) ;