Photon学习笔记(二)

来源:互联网 发布:php pack 大端 编辑:程序博客网 时间:2024/05/19 09:03

这里通过实现聊天功能来进一步学习Photon。

上节中服务端工程中,会添加一个MyPeer类,该类继承自PeerBase。这样,在每次新的客户端连入时,都会实例化一个MyPeer。

直接先上代码在做详细解释:

  • 创建一个新的类库项目”ChatServer”
  • 添加引用ExitGamesLibs.dll, Photon.SocketServer.dll and PhotonHostRuntimeInterfaces.dll
  • 创建一个新类的ChatServer和继承 Photon.SocketServer.ApplicationBase

    using Photon.SocketServer; public class ChatServer : ApplicationBase{    protected override PeerBase CreatePeer(InitRequest initRequest)    {    }     protected override void Setup()    {    }     protected override void TearDown()    {    }}

  • 创建一个新的类ChatPeer并继承自Photon.SocketServer.PeerBase

    using Photon.SocketServer;using PhotonHostRuntimeInterfaces; public class ChatPeer : PeerBase{    public ChatPeer(IRpcProtocol protocol, IPhotonPeer unmanagedPeer)        : base(protocol, unmanagedPeer)    {    }     protected override void OnDisconnect()    {    }     protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)    {    }}


  • ChatServer.CreatePeer返回一个新的ChatPeer实例

    protected override PeerBase CreatePeer(InitRequest initRequest){    return new ChatPeer(initRequest.Protocol, initRequest.PhotonPeer);}

  • 服务器配置文件如下:

    <Applications Default="ChatServer">    <Application        Name="ChatServer"        BaseDirectory="ChatServer"        Assembly="ChatServer"        Type="ChatServer" /></Applications>

  • 创建一个新的控制台项目作为聊天客户端
  • 添加引用PhotoDotNet.dll
  • 客户端代码:

    using System;using System.Collections.Generic;using System.Text; using ExitGames.Client.Photon; public class ChatClient : IPhotonPeerListener{    private bool connected;     public static void Main()    {        var client = new ChatClient();        var peer = new PhotonPeer(client, true);                     // connect        client.connected = false;        peer.Connect("127.0.0.1:4530", "ChatServer");        while (!client.connected)        {            peer.Service();        }         var buffer = new StringBuilder();        while (true)        {            peer.Service();             // read input            if (Console.KeyAvailable)            {                ConsoleKeyInfo key = Console.ReadKey();                if (key.Key != ConsoleKey.Enter)                {                    // store input                    buffer.Append(key.KeyChar);                }                else                {                    // send to server                    var parameters = new Dictionary<byte, object> { { 1, buffer.ToString() } };                    peer.OpCustom(1, parameters, true);                    buffer.Length = 0;                }            }        }    }     public void DebugReturn(DebugLevel level, string message)    {        Console.WriteLine(level + ": " + message);    }     public void OnEvent(EventData eventData)    {        Console.WriteLine("Event: " + eventData.Code);        if (eventData.Code == 1)        {              Console.WriteLine("Chat: " + eventData.Parameters[1]);        }    }     public void OnOperationResponse(OperationResponse operationResponse)    {        Console.WriteLine("Response: " + operationResponse.OperationCode);    }     public void OnStatusChanged(StatusCode statusCode)    {        if (statusCode == StatusCode.Connect)        {            this.connected = true;        }        else        {            Console.WriteLine("Status: " + statusCode);        }    }}
    为了验证这些信息是被接收到了,我们会在ChatPeer.OnOperationRequest响应一个OperationResponse:
    protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters){    var response = new OperationResponse(operationRequest.OperationCode);    this.SendOperationResponse(response, sendParameters);}

  • 接下来我们要做的就是在其他客户端接收聊天信息。我们实现了一个发布/订阅模式:
    using System;using Photon.SocketServer;using PhotonHostRuntimeInterfaces; public class ChatPeer : PeerBase{    private static readonly object syncRoot = new object();     public ChatPeer(IRpcProtocol protocol, IPhotonPeer unmanagedPeer)        : base(protocol, unmanagedPeer)    {        lock (syncRoot)        {            BroadcastMessage += this.OnBroadcastMessage;        }    }     private static event Action<ChatPeer, EventData, SendParameters> BroadcastMessage;     protected override void OnDisconnect()    {        lock (syncRoot)        {            BroadcastMessage -= this.OnBroadcastMessage;        }    }     protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)    {        var @event = new EventData(1) { Parameters = operationRequest.Parameters };        lock (syncRoot)        {            BroadcastMessage(this, @event, sendParameters);        }         var response = new OperationResponse(operationRequest.OperationCode);        this.SendOperationResponse(response, sendParameters);    }     private void OnBroadcastMessage(ChatPeer peer, EventData @event, SendParameters sendParameters)    {        if (peer != this)        {            this.SendEvent(@event, sendParameters);        }    }}

    这里需要解释的是:

    BroadcastMessage为私有静态事件,每次客户端连入初始化ChatPeer的同时,就会订阅事件。

    这里this代表的就是新连入的客户端。(每次新建一个客户端,都会实例化一次ChatPeer,因此this代表新建的客户端实例)

    OnBroadcastMessage中if判断语句实现不向自己发送事件,只向其他订阅了事件的对象(客户端)发送消息。

    
  • 0 0
    原创粉丝点击
    热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝店被关了钱怎么办 买家不申请退款怎么办 被买家恶意投诉怎么办 淘宝投诉后退款怎么办 天猫投诉不成功怎么办 苹果手机打不开流量怎么办 苹果6流量打不开怎么办 苹果笔记本电脑打不开软件怎么办 苹果软件蜂窝打不开怎么办 苹果手机wifi打不开怎么办 苹果app变成韩语怎么办 ipad键盘变成英文怎么办 苹果8商店打不开怎么办 苹果手机不能下载怎么办 天猫魔盒遥控器丢了怎么办 电视盒子声音小怎么办 宽带los亮红灯怎么办 猫的lan灯不亮怎么办 光猫los灯不亮怎么办 移动宽带红灯亮怎么办 ie打不开网页怎么办win10 win10系统ie打不开怎么办 笔记本电脑玩lol卡怎么办 火狐浏览器电脑版打不开怎么办 手机淘宝没密码怎么办 实体店不让退货怎么办 出生公证双认证怎么办 手机淘宝网速慢怎么办 淘宝开店认证不通过怎么办 开网店不会做图怎么办 库乐队上传错误怎么办 淘宝定金不退怎么办 淘宝店激活认证怎么办 淘宝店铺不卖怎么办 唯品会不支持退换货怎么办 pr里面的aep怎么办 开淘宝骗了怎么办 平板ipad已停用怎么办 ipad2卡 反应慢怎么办 无法弹出淘口令怎么办? ipad账户被禁用怎么办