一からアプリを構築
このチュートリアルではアプリケーションを一から構築する方法について説明します。
単純なChat Serverを10分で構築
このチュートリアルは、Photonアプリケーションとピアの基本的な概念を理解するための最初のステップです。
- Photon Server SDKをダウンロードし 、解凍してください。
- Visual Studioを使用し、新規のクラスライブラリプロジェクト
ChatServer
を作成してください。 - ExitGamesLibs.dll、Photon.SocketServer.dll、PhotonHostRuntimeInterfaces.dllに参照を追加します。
Photon.SocketServer.ApplicationBase
から継承する、新規のクラスChatServer
を作成してください:
C#
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
を作成してください:
C#
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
で返してください:
C#
protected override PeerBase CreatePeer(InitRequest initRequest)
{
return new ChatPeer(initRequest);
}
Default
のPhotonインスタンス上で、PhotonのネイティブコアによってChatServer
アセンブリが読み込まれます。
したがって、サーバ構成ファイルであるPhotonServer.config
にはそのアプリケーションの適切な定義を含む必要があります。
以下のスニペットでは、この処理を簡単におこなう方法を示しています:
XML
<?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への参照を追加してください。
クライアントコードは以下のようになります:
C#
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.OnOperationRequest
のOperationResponse
でレスポンスします。
C#
protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
{
// send operation response (~ACK) back to peer
var response = new OperationResponse(operationRequest.OperationCode);
SendOperationResponse(response, sendParameters);
}
これで、チャットクライアントがイベントコードとチャットメッセージを出力できるようになりました。
次に、他のクライアントでチャットメッセージを受信できるようにします。パブリッシュ/登録パターンを使用して、受信者を実装しましょう。
C#
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を起動または再起動する際は新しい設定を使用してください。詳細は ドキュメントページを参照してください。
Back to top