server | v4 switch to v3  

一からアプリを構築

このチュートリアルではアプリケーションを一から構築する方法について説明します。

このチュートリアルは、Photon Chat製品とは関連がありません。 Photon Serverアプリケーションを開始する方法を示すための、非常に基本的で単純なデモのサンプルです。

単純なChat Serverを10分で構築

注:「Photonを5分で開始」の手順にしたがって、ローカルでPhoton Serverを実行していることが前提となります。

このチュートリアルは、Photonアプリケーションとピアの基本的な概念を理解するための最初のステップです。

  • Photon Server SDKをダウンロードし 、解凍してください。
  • Visual Studioを使用し、新規のクラスライブラリプロジェクトChatServerを作成してください。
  • ExitGamesLibs.dllPhoton.SocketServer.dllPhotonHostRuntimeInterfaces.dllに参照を追加します。

Photon.SocketServer.ApplicationBaseから継承する、新規のクラスChatServerを作成してください:

    using Photon.SocketServer;

    public class ChatServer : ApplicationBase
    {
        protected override PeerBase CreatePeer(InitRequest initRequest)
        {
        }

        protected override void Setup()
        {
        }

        protected override void TearDown()
        {
        }
    }

Photon.SocketServer.ClientPeerから継承する、新規のクラスChatPeerを作成してください:

    using Photon.SocketServer;
    using PhotonHostRuntimeInterfaces;

    public class ChatPeer : ClientPeer
    {
        public ChatPeer(InitRequest initRequest)
            : base(initRequest)
        {
        }

        protected override void OnDisconnect(DisconnectReason disconnectCode, string reasonDetail)
        {
        }

        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
        }
    }

ChatPeerの新しいインスタンスをChatServer.CreatePeerで返してください:

        protected override PeerBase CreatePeer(InitRequest initRequest)
        {
            return new ChatPeer(initRequest);
        }

DefaultのPhotonインスタンス上で、PhotonのネイティブコアによってChatServerアセンブリが読み込まれます。 したがって、サーバ構成ファイルであるPhotonServer.configにはそのアプリケーションの適切な定義を含む必要があります。 以下のスニペットでは、この処理を簡単におこなう方法を示しています:

<?xml version="1.0"?>
<Configuration>
    <ChatServer DisplayName="Chat Server">
        <TCPListeners>
            <TCPListener
                IPAddress="0.0.0.0"
                Port="4530"
                OverrideApplication="ChatServer"
                >
            </TCPListener>
        </TCPListeners>
        <!-- Defines the Photon Runtime Assembly to use. -->
        <Runtime
            Assembly="PhotonHostRuntime, Culture=neutral"
            Type="PhotonHostRuntime.PhotonDomainManager"
            UnhandledExceptionPolicy="Ignore">
        </Runtime>
        <!-- other elements -->
        <Applications Default="ChatServer">
            <Application
                Name="ChatServer"
                BaseDirectory="ChatServer"
                Assembly="ChatServer"
                Type="ChatServer">
            </Application>
            <!-- any other applications -->
        </Applications>
        <!-- other elements -->
    </ChatServer>
</Configuration>

この設定では、サーバーバイナリがdeploy/ChatServer/bin下に配置される点、およびChatServerクラスがネームスペースに属さない点が必須です。 サーバー設定に関する詳細は、ドキュメントの各ページを参照してください。

チャットクライアント用に新規のコンソールプロジェクトを作成してください。 新規プロジェクトにPhoton3DotNet.dllへの参照を追加してください。 クライアントコードは以下のようになります:

using System;
using System.Collections.Generic;
using ExitGames.Client.Photon;
using System.Threading;

public class ChatClient : IPhotonPeerListener
{
    private bool connected;
    PhotonPeer peer;

    public static void Main()
    {
        var client = new ChatClient();
        client.peer = new PhotonPeer(client, ConnectionProtocol.Tcp);
        // connect
        client.DebugReturn(DebugLevel.INFO, "Connecting to server at 127.0.0.1:4530 using TCP");
        client.peer.Connect("127.0.0.1:4530", "ChatServer");
        // client needs a background thread to dispatch incoming messages and send outgoing messages
        client.Run();
        while (true)
        {
            if (!client.connected) { continue; }
            // read input
            string buffer = Console.ReadLine();
            // send to server
            var parameters = new Dictionary<byte, object> { { 1, buffer } };
            client.peer.OpCustom(1, parameters, true);
        }
    }

    private void UpdateLoop()
    {
        while (true)
        {
            peer.Service();
        }
    }

    public void Run()
    {
        Thread thread = new Thread(UpdateLoop);
        thread.IsBackground = true;
        thread.Start();
    }

    #region IPhotonPeerListener

    public void DebugReturn(DebugLevel level, string message)
    {
        Console.WriteLine(string.Format("{0}: {1}", level, message));
    }

    public void OnEvent(EventData eventData)
    {
        DebugReturn(DebugLevel.INFO, eventData.ToStringFull());
        if (eventData.Code == 1)
        {
            DebugReturn(DebugLevel.INFO, string.Format("Chat Message: {0}", eventData.Parameters[1]));
        }
    }

    public void OnMessage(object messages)
    {
        throw new NotImplementedException();
    }

    public void OnOperationResponse(OperationResponse operationResponse)
    {
        DebugReturn(DebugLevel.INFO, operationResponse.ToStringFull());
    }

    public void OnStatusChanged(StatusCode statusCode)
    {
        if (statusCode == StatusCode.Connect)
        {
            connected = true;
        }
        switch (statusCode)
        {
            case StatusCode.Connect:
                DebugReturn(DebugLevel.INFO, "Connected");
                connected = true;
                break;
            default:
                DebugReturn(DebugLevel.ERROR, statusCode.ToString());
                break;
        }
    }

    #endregion
}

これで、サーバーを起動するとクライアントは接続してテキストメッセージを送信することができます。ただし、テキストメッセージを処理するためのロジックが必要です。メッセージが受信されたことを確かめるため、ChatPeer.OnOperationRequestOperationResponseで応答します。

    protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
    {
        // send operation response (~ACK) back to peer
        var response = new OperationResponse(operationRequest.OperationCode);
        SendOperationResponse(response, sendParameters);
    }

これで、チャットクライアントがイベントコードとチャットメッセージを出力できるようになりました。 次に、他のクライアントでチャットメッセージを受信できるようにします。パブリッシュ/登録パターンを使用して、受信者を実装しましょう。

using Photon.SocketServer;
using PhotonHostRuntimeInterfaces;
using System;

public class ChatPeer : ClientPeer
{
    public ChatPeer(InitRequest request)
        : base(request)
    {
        BroadcastMessage += OnBroadcastMessage;
    }

    private static event Action<ChatPeer, EventData, SendParameters> BroadcastMessage;

    protected override void OnDisconnect(DisconnectReason disconnectCode, string reasonDetail)
    {
        BroadcastMessage -= OnBroadcastMessage;
    }

    protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
    {
        if (operationRequest.OperationCode == 1) // Chat Custom Operation Code = 1
        {
            // broadcast chat custom event to other peers
            var eventData = new EventData(1) { Parameters = operationRequest.Parameters }; // Chat Custom Event Code = 1
            BroadcastMessage(this, eventData, sendParameters);
            // send operation response (~ACK) back to peer
            var response = new OperationResponse(operationRequest.OperationCode);
            SendOperationResponse(response, sendParameters);
        }
    }

    private void OnBroadcastMessage(ChatPeer peer, EventData eventData, SendParameters sendParameters)
    {
        if (peer != this) // do not send chat custom event to peer who called the chat custom operation
        {
            SendEvent(eventData, sendParameters);
        }
    }
}

これで、2つのクライアントを起動した際にメッセージのやり取りができるようになりました。Photon Serverを起動または再起動する際は新しい設定を使用してください。詳細は ドキュメントページを参照してください。

ドキュメントのトップへ戻る