photon服务器具体实例

     正在做一个麻将游戏photon服务器,看了许多博客都是其框架知识,就把游戏中核心一些实例代码发一下。

     首先是服务器接收客户信息并处理:

    1)一个服务器核心类 public class ConnectPeer:ClientPeer  用于向客户端传输信息 

    根据用于传输的事件的类型来具接收后根据抽象类实现不同事件:Execute

    protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)

        {

            var code = operationRequest.OperationCode;

            var response = handlerDic[code].Execute(operationRequest);//具体实现抽象方法 根据参数实现不同事件          

            SendOperationResponse(response, sendParameters);//传递事件给自己

         } 

 

        服务器接收的不同的抽象事并实现:

 public ConnectPeer(InitRequest initRequest) : base(initRequest)

        {  各种事件

            handlerDic[OperationCode.MAHJ_EXECUTE] = new MahjGameOperation(this);

            handlerDic[OperationCode.LOGIN] = new OnLogin(this);

            handlerDic[OperationCode.CREATE_ROOM] = new CreateRoom(this);

            handlerDic[OperationCode.CHECK_CREATE_ROOM] = new CheckCreateRooms(this);

            handlerDic[OperationCode.JOIN_ROOM] = new JoinRoom(this);

            handlerDic[OperationCode.DISSOLVE_ROOM] = new DissolveRoom(this);

            handlerDic[OperationCode.READY_GAME] = new ReadyGame(this);

            handlerDic[OperationCode.CHAT] = new ChatHandle(this);

        }

 抽象类 各事件继承它

 public abstract class BaseHandler

    {

        protected ConnectPeer Peer;

        protected BaseHandler(ConnectPeer peer)

        {

            Peer = peer;

        }

        public abstract OperationResponse Execute(OperationRequest operationRequest);

}

2)服务器向向客户端传输信息

1.SendOperationResponse(response, sendParameters);//传递事件给自己

2. public void SendMsg(byte msgCode, Dictionary<byte, object> data, ConnectPeer recipient)

        { 

           向单个客户recipient端发送信息

            IEventData evt = new EventData(msgCode, data);

            recipient.SendEvent(evt, new SendParameters());//发送信息方法

        }

一个传输通讯集合 存储着客户端

     public List<ConnectPeer> RecipteList(ConnectPeer except)

        {

            return

            (from cardPartner in PartnerArray

                where cardPartner.UserPeer != except && cardPartner.UserPeer != null

                select cardPartner.UserPeer).ToList();

        }

IEnumerable<ConnectPeer> recipientList 存储一个房间内所有的客户(当加入房间时存储,离开再清除)

        public void SendMsg(byte msgCode, Dictionary<byte, object> data, IEnumerable<ConnectPeer> recipientList)

        {   向多个客户recipient 端发送信息

            IEventData evt = new EventData(msgCode, data);

            foreach (var recipient in recipientList)

            {

              

                recipient.SendEvent(evt, new SendParameters());//发送信息给其他客户端

            }

        }

 数据的序列化用于传输

            例如: data[ParameterCode.RULE] = mahjRoom.Rule.Serialize();

                     data[ParameterCode.USERS] = room.Players.Serialize();

 数据的反序列化用于解析得到信息

            例如  var data = operationRequest.Parameters; 转换为data

                 var myUser = data.GetValue(ParameterCode.MY_USER).Deserialize<MyUser>();还有通过peer得到信息Var mahjRoom = Peer.JoinedRoom as AutomaticMahj;

          传输的peer是可以得到传输的客户端用户等信息

   private CardPartner GetPartner(ConnectPeer peer) => PartnerArray.First(

            partner => partner.UserPeer.User.Unionid == peer.User.Unionid);//根据peer中user属性的unionid获取Partner


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值