server | v4 switch to v3  

Server-To-Server 소개

이 튜토리얼은 고급 개발자를 위한 것 입니다. 이제 막 Photon 을 사용하기 시작 한 경우라면 이 튜토리얼을 건너 뛰어도 좋습니다.

복잡한 게임을 개발 중이라면 서로 다른 서버간에 기능을 분산시키는 것을 원할 수 도 있습니다. Photon 의 Server-To-Server (S2S) 기능을 이용하여 Photon 서버간에 커뮤니케이션을 구현할 수 있습니다.

개념

Photon 의 S2S-커뮤니케이션은 클라이언트-서버 커뮤니케이션과 매우 유사합니다. 하나의 Photon 인스턴스가 (연결의 측면에서는 "outbound" 가 됩니다) 타겟 Photon 서버(연결의 측면에서는 "inbound") 연결을 초기화합니다. 각 측에서는 피어가 생성되고 오퍼레이션/이벤트를 S2S 연결로 전송 할 수 있습니다.

Back To Top

Outbound 측

ApplicationBase 에서 상속 받은 "MyOutboundApplication" 이라는 어플리케이션이 있다고 가정하도록 하겠습니다.

S2S-연결을 초기화 하기 위해서, OutboundS2SPeer.ConnectXXX 계열의 메소드 하나를 호출 해야 합니다. S2S 커뮤니케이션에서는 TCP 연결을 사용하는 것을 권장 합니다.

이 코드는 S2S 연결을 설정하기 위하여 필요 합니다:

    public class MyOutboundApplication : ApplicationBase
    {
        private MyOutboundPeer outboundPeer;
        protected override void Setup()
        {
            this.outboundPeer = new MyOutboundPeer(this);
            this.outboundPeer.ConnectTcp(new IPEndPoint(IPAddress.Parse("123.456.789.123"), 4520), "MyInboundApplication"); 
        }
    }

위 코드는 Setup() 하는 동안 S2S 연결을 성립합니다. 물론 나중에 코드에서 수행할 수 도 있습니다. 아무튼, 두개 서버간에는 단 하나의 연결만이 있어야 합니다 - 연결을 계속 오픈상태로 유지시키고 하나의 연결을 통하여 모든 데이터를 전송하세요.

타겟 서버로 데이터를 전송하기 위해서는 그 피어의 SendOperation 메소드를 아래 처럼 단순하게 호출 하면 됩니다:

    public void SendMessageToMaster(string message)
    {
        var parameters = new Dictionary<byte, object>();
        parameters[0] = message;
        this.outboundPeer.SendOperationRequest(new OperationRequest { OperationCode = 1, Parameters = parameters }, new SendParameters());
    }

"OutboundPeer" 의 구현도 또한 매우 간단합니다. 다음은 가장 최소한의 샘플이며 나만의 코드로 맞추어 주세요:

    public class MyOutboundPeer : OutboundS2SPeer
    {
        public MyOutboundPeer(ApplicationBase application)
            : base(application)
        {
        }
        protected override void OnConnectionEstablished(object responseObject)
        {
        }
        protected override void OnConnectionFailed(int errorCode, string errorMessage)
        {
            // add some custom error handling here 
        }
        protected override void OnOperationResponse(OperationResponse operationResponse, SendParameters sendParameters)
        {
        }
        protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
        {
        }
    }

만약 연결이 성공적으로 성립되었다면 OnConnectionEstablished 메소드가 트리거 됩니다. 그렇지 않으면 OnConnectionFailed() 메소드가 호출 됩니다. 이 메소드를 오버라이드 하여 일부 에러 핸들링을 추가, 로깅 등을 추가 할 수 도 있습니다. 이것이 S2S 연결의 "outbound" 측에서 필요한 모든 것 입니다.

Back To Top

"inbound" 측

"outbound" 측이 완료 되었으므로, S2S 연결에 대한 "inbound" 측을 구현 해야 합니다. 우선, 피어 객체를 생성해야 합니다. incoming 연결 소스를 결정하기 위해서는("클라이언트" 또는"서버") 다른 포트를 리슨(listen)하는 것을 권장 합니다.

ApplicationBase 로 부터 상속 받은 어플리케이션이 있다고 가정 해 보겠습니다. 다음의 코드를 추가하세요:

      protected override PeerBase CreatePeer(InitRequest initRequest)
    {
        if (initRequest.LocalPort == 4520)
        {
            // for S2S connections
            return new MyInboundPeer(initRequest); 
        }
    }

The MyInboundPeer is just a simple class that inherits of the PeerBase class:

    public class MyInboundPeer : InboundS2SPeer
    {
        public MyInboundPeer(InitRequest initRequest)
            : base(initRequest)
        {
        }
        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
            // implement this to receive operation data
        }
        protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
        {
        }
    }

S2S 연결의 "inbound"측에서 할 모든 것 입니다.

Back To Top

환경 설정

inbound 측에서 S2S 연결의 Listen할 포트를 분리하는 것으로 결정 했다면 PhotonServer.config 에 다음과 같이 새로운 리스너를 정의 해 주어야 합니다:

    <!-- DON'T EDIT THIS. TCP listener for S2S connections on MyOutbound application -->
    <TCPListener
        IPAddress="0.0.0.0"
        Port="4520">
    </TCPListener>

기술문서 TOP으로 돌아가기