server:
MyserverApplication 类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Photon.SocketServer; namespace MyServer { public class MyServerApplication : ApplicationBase { protected override PeerBase CreatePeer(InitRequest initRequest) { // 建立連線並回傳給Photon Server return new MyServerPeer(initRequest.Protocol, initRequest.PhotonPeer); } protected override void Setup() { // 初始化GameServer } protected override void TearDown() { // 關閉GameServer並釋放資源 } } }
MyServerPeer:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Photon.SocketServer; using PhotonHostRuntimeInterfaces; namespace MyServer { public class MyServerPeer : PeerBase { #region 建構與解構式 public MyServerPeer(IRpcProtocol rpcProtocol, IPhotonPeer nativePeer) : base(rpcProtocol, nativePeer) { } #endregion protected override void OnDisconnect(PhotonHostRuntimeInterfaces.DisconnectReason reasonCode, string reasonDetail) { // 失去連線時要處理的事項,例如釋放資源 } protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters) { // 取得Client端傳過來的要求並加以處理 switch (operationRequest.OperationCode) { case 5: { if (operationRequest.Parameters.Count < 2) // 若參數小於2則返回錯誤 { // 返回登入錯誤 OperationResponse response = new OperationResponse(operationRequest.OperationCode) { ReturnCode = (short)2, DebugMessage = "Login Fail" }; SendOperationResponse(response, new SendParameters()); } else { var memberID = (string)operationRequest.Parameters[1]; var memberPW = (string)operationRequest.Parameters[2]; if (memberID == "test" && memberPW == "1234") { int Ret = 1; var parameter = new Dictionary<byte, object> { { 80, Ret }, {1, memberID}, {2, memberPW}, {3, "Kyoku"} // 80代表回傳值, 3代表暱稱 }; OperationResponse response = new OperationResponse(operationRequest.OperationCode, parameter) { ReturnCode = (short)0, DebugMessage = "" }; SendOperationResponse(response, new SendParameters()); } else { OperationResponse response = new OperationResponse(operationRequest.OperationCode) { ReturnCode = (short)1, DebugMessage = "Wrong id or password" }; SendOperationResponse(response, new SendParameters()); } } break; } } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ExitGames.Client.Photon; namespace EZClient { class Program : IPhotonPeerListener { public bool ServerConnected; public bool OnLogin; PhotonPeer peer; public Program() { ServerConnected = false; OnLogin = false; this.peer = new PhotonPeer(this, ConnectionProtocol.Udp); } static void Main(string[] args) { new Program().Run(); } public void Run() { if (peer.Connect("localhost:5055", "MyServer")) // 若成功連到Server { do { peer.Service(); // 在主迴圈取得Server傳過來的命令,當有傳命令過來時依命令的類型,EventAction或OperationResult會被觸發 if (ServerConnected && !OnLogin) { Console.WriteLine("\n請輸入會員帳號:"); string memberID = Console.ReadLine(); Console.WriteLine("\n請輸入會員密碼:"); string memberPW = Console.ReadLine(); var parameter = new Dictionary<byte, object> { { (byte)1, memberID.Trim() }, { (byte)2, memberPW.Trim() } // parameter key memberID=1, memberPW=2 }; this.peer.OpCustom(5, parameter, true); // 命令代碼為5 OnLogin = true; } System.Threading.Thread.Sleep(500); // 休息.5秒以免鎖死電腦 } while (true); } else { Console.WriteLine("Unknown hostname!"); } } public void DebugReturn(DebugLevel level, string message) { // 印出Debug的回傳字串 Console.WriteLine("Debug messsage : " + message); } public void OnEvent(EventData eventData) { // 取得Server傳過來的事件 } public void OnOperationResponse(OperationResponse operationResponse) { // 取得Server傳過來的命令回傳 switch (operationResponse.OperationCode) { case (byte)5: // 在此範例是訂5為Login要求 { switch (operationResponse.ReturnCode) { case (short)0: // ReturnCode 0 代表成功 { int Ret = Convert.ToInt16(operationResponse.Parameters[(byte)80]); string memberID = Convert.ToString(operationResponse.Parameters[(byte)1]); string memberPW = Convert.ToString(operationResponse.Parameters[(byte)2]); string Nickname = Convert.ToString(operationResponse.Parameters[(byte)3]); Console.WriteLine("Login Success \nRet={0} \nMemberID={1} \nMemberPW={2} \nNickname={3} \n", Ret, memberID, memberPW, Nickname); break; } case (short)1: // 帳號或密碼錯誤 { Console.WriteLine(operationResponse.DebugMessage); break; } case (short)2: // 傳入的參數錯誤 { Console.WriteLine(operationResponse.DebugMessage); break; } default: { Console.WriteLine(String.Format("不明的ReturnCode : {0}", operationResponse.ReturnCode)); break; } } break; } default: { Console.WriteLine(String.Format("不明的OperationCode : {0}", operationResponse.OperationCode)); break; } } } public void OnStatusChanged(StatusCode statusCode) { // 連線狀態變更的通知 Console.WriteLine("PeerStatusCallback:" + statusCode.ToString()); switch (statusCode) { case StatusCode.Connect: // 若己連線 ServerConnected = true; break; case StatusCode.Disconnect: // 若己離線 ServerConnected = false; break; } } } }
unity3d_client:
using UnityEngine; using System.Collections; using System.Security; using System; using System.Collections.Generic; using ExitGames.Client.Photon; public class PhotonClient : MonoBehaviour, IPhotonPeerListener { public string ServerAddress = "localhost:5055"; protected string ServerApplication = "MyServer"; protected PhotonPeer peer; public bool ServerConnected; public string memberID = ""; public string memberPW = ""; public bool LoginStatus; public string getMemberID = ""; public string getMemberPW = ""; public string getNickname = ""; public int getRet = 0; public string LoginResult = ""; // Use this for initialization void Start () { this.ServerConnected = false; this.LoginStatus = false; this.peer = new PhotonPeer(this, ConnectionProtocol.Udp); this.Connect(); } internal virtual void Connect() { try { this.peer.Connect(this.ServerAddress, this.ServerApplication); } catch (SecurityException se) { this.DebugReturn(0, "Connection Failed. " + se.ToString()); } } // Update is called once per frame void Update () { this.peer.Service(); } public void DebugReturn (DebugLevel level, string message) { Debug.Log(message); } public void OnOperationResponse (OperationResponse operationResponse) { // display operationCode this.DebugReturn(0, string.Format("OperationResult:" + operationResponse.OperationCode.ToString())); switch (operationResponse.OperationCode) { case 5: { if( operationResponse.ReturnCode == 0) // if success { getRet = Convert.ToInt32(operationResponse.Parameters[80]); getMemberID = Convert.ToString(operationResponse.Parameters[1]); getMemberPW= Convert.ToString(operationResponse.Parameters[2]); getNickname= Convert.ToString(operationResponse.Parameters[3]); LoginStatus = true; } else { LoginResult = operationResponse.DebugMessage; LoginStatus = false; } break; } } } public void OnStatusChanged (StatusCode statusCode) { this.DebugReturn(0, string.Format("PeerStatusCallback: {0}", statusCode)); switch (statusCode) { case StatusCode.Connect: this.ServerConnected = true; break; case StatusCode.Disconnect: this.ServerConnected = false; break; } } public void OnEvent (EventData eventData) { throw new System.NotImplementedException (); } void OnGUI() { GUI.Label(new Rect(30,10,400, 20), "EZServer Unity3D Test"); if( this.ServerConnected ) { GUI.Label(new Rect(30,30,400, 20), "Connected"); GUI.Label(new Rect(30,60,80, 20), "MemberID:"); memberID = GUI.TextField(new Rect(110, 60, 100, 20), memberID, 10); GUI.Label(new Rect(30,90,80, 20), "MemberPW:"); memberPW = GUI.TextField(new Rect(110, 90, 100, 20), memberPW, 10); if( GUI.Button( new Rect(30,120,100,24 ), "Login") ) { var parameter = new Dictionary<byte, object> { { (byte)1, memberID }, { (byte)2, memberPW } // parameter key memberID=1, memberPW=2 }; this.peer.OpCustom(5, parameter, true); // operationCode is 5 } if( LoginStatus ) { GUI.Label(new Rect(30,150,400, 20), "Your MemberID : " + getMemberID); GUI.Label(new Rect(30,170,400, 20), "Your Password : " + getMemberPW); GUI.Label(new Rect(30,190,400, 20), "Your Nickname : " + getNickname); GUI.Label(new Rect(30,210,400, 20), "Ret : " + getRet.ToString()); } else { GUI.Label(new Rect(30,150,400, 20), "Please Login"); GUI.Label(new Rect(30,170,400, 20), LoginResult); } } else { GUI.Label(new Rect(30,30,400, 20), "Disconnect"); } } }