Photon学习笔记(二)
来源:互联网 发布:php pack 大端 编辑:程序博客网 时间:2024/05/19 09:03
这里通过实现聊天功能来进一步学习Photon。
上节中服务端工程中,会添加一个MyPeer类,该类继承自PeerBase。这样,在每次新的客户端连入时,都会实例化一个MyPeer。
直接先上代码在做详细解释:
using Photon.SocketServer; public class ChatServer : ApplicationBase{ protected override PeerBase CreatePeer(InitRequest initRequest) { } protected override void Setup() { } protected override void TearDown() { }}
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) { }}
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>
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
- Photon学习笔记(二)
- Photon学习笔记(二)
- Photon学习笔记(一)
- Photon学习笔记(一)
- Photon学习笔记
- photon mapping学习笔记
- Photon学习笔记(三)
- photon mapping学习笔记
- Photon + Unity3D 线上游戏开发 学习笔记(二)
- Photon(二)
- unity服务器Photon Server学习笔记
- Unity3D自学笔记——Photon服务器的后台架构实现(二)
- Photon Server游戏服务器从零开始学习(二) Log日志文件配置与输出
- 学习UNITY3D网络插件photon pun和PhotonServer<二>
- Unity+ Photon服务器实时对战游戏——Photon服务器介绍(二)
- Photon Server4.0版本入门(二)创建一个Photon的ServerDemo
- Photon服务器入门二
- Photon服务器入门教程二
- FPGA几种常见设计思想,在编程的过程中会慢慢体会到
- java调用第三方dll文件心得
- 字段的值转换为大小写
- NOTE# IROM识别
- HDU 5071 Chat 暴力模拟
- Photon学习笔记(二)
- windows8 打不开IE浏览器 的解决方法 ,实测可行
- mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)
- 管理Activity的生命周期(4)重建Activity
- AJAx提交表单
- iOS 应用发布流程
- freemark 导出文档
- java调用SAP RFC函数
- 数据结构 第五章 思维导图