前面已经把服务器搭建好了, 现在来整理客户端
1,打开unity3D新建工程PhotonServerUnityClient,新建文件夹Plugins 打开服务器目录找到lib找到Photon3Unity3D.dll 导入Plugins ,然后新建空节点命名为PhotonEngine添加PhotonEngine脚本 实现内容入下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ExitGames.Client.Photon;
using System;
public class PhotoEngine : MonoBehaviour,IPhotonPeerListener {
private static PhotoEngine _instance; // 全局单例模式
private PhotonPeer peer;
public void DebugReturn(DebugLevel level, string message)
{
throw new NotImplementedException();
}
//服务器端向客户端发起数据的时候
public void OnEvent(EventData eventData)
{
throw new NotImplementedException();
}
//客户端向服务器发起一个请求以后服务器处理完以后 就会给客户端一个相应
public void OnOperationResponse(OperationResponse operationResponse)
{
throw new NotImplementedException();
}
//状态改变的时候调用该方法 PeerStateValue.。。。
public void OnStatusChanged(StatusCode statusCode)
{
Debug.Log(statusCode);
}
void Awake()
{
if (_instance==null)
{
_instance = this;
DontDestroyOnLoad(this.gameObject);
}
else if (_instance!=this)
{
//所有场景只留一个PhotonEngine 删除多余的
Destroy(this.gameObject);return;
}
}void Start() {
//通过listener来接收服务器端的相应
peer = new PhotonPeer(this,ConnectionProtocol.Udp);
//连接服务器 发起连接
peer.Connect("127.0.0.1:5055", "MyGame1");
}void Update () {
peer.Service(); //发起请求 无论什么状态下
}
void OnDestroy()
{
if (peer!=null&&(peer.PeerState==PeerStateValue.Connected)) // 当peer不等于空 而且 正在运行的时候
{
peer.Disconnect();//断开连接
}
}
}
2,客服端和服务器进行参数交互 原理如图所示
客户端新建一个Test脚本挂在PhotonEngine用来跟服务器发送请求 代码实现如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))
{
SendRequest();
}
}
void SendRequest()
{
Dictionary data = new Dictionary();
data.Add(1, 100);
data.Add(2, "nihaoma");
PhotoEngine.Peer.OpCustom(1, data, true); //向服务器发起请求⑴
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Photon.SocketServer;
using PhotonHostRuntimeInterfaces;
namespace MyGameServer
{
public class ClientPeer : Photon.SocketServer.ClientPeer //
{
public ClientPeer(InitRequest initRequest) : base(initRequest)
{
}
//断开连接 清理工作
protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
{
}
//处理客户端发起请求
protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
{
switch (operationRequest.OperationCode)//通过OPCode区分请求
{
case 1 : MyGameServer.log.Info("收到了一个客户端的请求");
Dictionary data= operationRequest.Parameters; //服务器接到客户端的请求⑴
object intvalue;
data.TryGetValue(1, out intvalue);
object stringValue;
data.TryGetValue(2, out stringValue);
MyGameServer.log.Info("得到的参数数据是"+" " + intvalue.ToString() + " " + stringValue.ToString());
//--------------------------------------------------------------
Dictionary data2 = new Dictionary();
data2.Add(1, 10220);
data2.Add(2, "niha22oma");
OperationResponse opResponse = new OperationResponse(1, data2); //服务器向客户端回应请求
//opResponse.SetParameters(data2); //这个方法集成在 new OperationResponse(1, data2)了
SendOperationResponse(opResponse, sendParameters); //回传给客户端 给客户端一个回应
break;
case 2:
break;
default:
break;
}
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ExitGames.Client.Photon; //插件的命名空间
using System;
public class PhotoEngine : MonoBehaviour,IPhotonPeerListener {
public static PhotonPeer Peer
{
get
{
return peer;
}
}
private static PhotoEngine _instance; // 全局单例模式
private static PhotonPeer peer;
public void DebugReturn(DebugLevel level, string message)
{
throw new NotImplementedException();
}
//服务器端向客户端发起数据的时候
public void OnEvent(EventData eventData)
{
throw new NotImplementedException();
}
//客户端向服务器发起一个请求以后服务器处理完以后 就会给客户端一个相应
public void OnOperationResponse(OperationResponse operationResponse)
{
switch (operationResponse.OperationCode)
{
case 1:
Debug.Log("收到了服务器的相应OpColde: 1");
Dictionary data2 = operationResponse.Parameters;
object intvalue;
data2.TryGetValue(1, out intvalue);
object stringValue;
data2.TryGetValue(2, out stringValue);
Debug.Log(intvalue.ToString() + " " + stringValue.ToString());
break;
case 2:
break;
default:
break;
}
}
//状态改变的时候调用该方法 PeerStateValue.。。。
public void OnStatusChanged(StatusCode statusCode)
{
Debug.Log(statusCode);
}
void Awake()
{
if (_instance==null)
{
_instance = this;
DontDestroyOnLoad(this.gameObject);
}
else if (_instance!=this)
{
//所有场景只留一个PhotonEngine 删除多余的
Destroy(this.gameObject);return;
}
}
void Start () {
//通过listener来接收服务器端的相应
peer = new PhotonPeer(this,ConnectionProtocol.Udp);
//连接服务器 发起连接
peer.Connect("127.0.0.1:5055", "MyGame1");
}
void Update () {
peer.Service(); //检测有没有 发起请求 无论什么状态下
//peer.Service();
}
void OnDestroy()
{
if (peer!=null&&(peer.PeerState==PeerStateValue.Connected)) // 当peer不等于空 而且 正在运行的时候
{
peer.Disconnect();//断开连接
}
}
}
3,接下来是 如果客户端不像服务器发送请求 服务器是没办法通过 SendOperationResponse 像数据发送请求,如果服务器想想客户端发送请求该怎么办呢 代码实现如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Photon.SocketServer;
using PhotonHostRuntimeInterfaces;
namespace MyGameServer
{
public class ClientPeer : Photon.SocketServer.ClientPeer //
{
public ClientPeer(InitRequest initRequest) : base(initRequest)
{
}
//断开连接 清理工作
protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
{
}
//处理客户端发起请求
protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
{
switch (operationRequest.OperationCode)//通过OPCode区分请求
{
case 1:
MyGameServer.log.Info("收到了一个客户端的请求");
Dictionary data = operationRequest.Parameters; //服务器接到客户端的请求⑴
object intvalue;
data.TryGetValue(1, out intvalue);
object stringValue;
data.TryGetValue(2, out stringValue);
MyGameServer.log.Info("得到的参数数据是" + " " + intvalue.ToString() + " " + stringValue.ToString());
//--------------------------------------------------------------
Dictionary data2 = new Dictionary();
data2.Add(1, 10220);
data2.Add(2, "niha22oma");
OperationResponse opResponse = new OperationResponse(1, data2); //服务器向客户端回应请求
//opResponse.SetParameters(data2); //这个方法集成在 new OperationResponse(1, data2)了
SendOperationResponse(opResponse, sendParameters); //回传给客户端 给客户端一个相应
//===========如果客户端没有想服务器发送请求 服务器要通知客户端的情况下要用下面这种方法=================
EventData eventdata = new EventData(1);//也可以写成 EventData eventdata = new EventData(1,data2); 当然下面那一步就不要了
eventdata.Parameters = data2;
SendEvent(eventdata, sendParameters); //sendParameters 或者写成new SendParameters();是不影响的 ----在服务器的任何地方都可以调用
break;
case 2:
break;
default:
break;
}
}
}
}
然后在客户端 接收到 服务器发送的事件 并进行解析代码实现如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ExitGames.Client.Photon; //插件的命名空间
using System;
public class PhotoEngine : MonoBehaviour,IPhotonPeerListener {
public static PhotonPeer Peer
{
get
{
return peer;
}
}
private static PhotoEngine _instance; // 全局单例模式
private static PhotonPeer peer;
public void DebugReturn(DebugLevel level, string message)
{
throw new NotImplementedException();
}
//服务器端向客户端发起数据的时候
public void OnEvent(EventData eventData)
{//这个方法会接收所有服务器发来的事件 所以要用switch判断一下code
switch (eventData.Code)
{
case 1:
Debug.Log("收到服务器发过来的事件 ");
Dictionary data3= eventData.Parameters;
object intvalue;
data3.TryGetValue(1, out intvalue);
object stringValue;
data3.TryGetValue(2, out stringValue);
Debug.Log(intvalue.ToString() + " " + stringValue.ToString());
break;
default:
break;
}
}
//客户端向服务器发起一个请求以后服务器处理完以后 就会给客户端一个相应
public void OnOperationResponse(OperationResponse operationResponse)
{
switch (operationResponse.OperationCode)
{
case 1:
Debug.Log("收到了服务器的相应OpColde: 1");
Dictionary data2 = operationResponse.Parameters;
object intvalue;
data2.TryGetValue(1, out intvalue);
object stringValue;
data2.TryGetValue(2, out stringValue);
Debug.Log(intvalue.ToString() + " " + stringValue.ToString());
break;
case 2:
break;
default:
break;
}
}
//状态改变的时候调用该方法 PeerStateValue.。。。
public void OnStatusChanged(StatusCode statusCode)
{
Debug.Log(statusCode);
}
void Awake()
{
if (_instance==null)
{
_instance = this;
DontDestroyOnLoad(this.gameObject);
}
else if (_instance!=this)
{
//所有场景只留一个PhotonEngine 删除多余的
Destroy(this.gameObject);return;
}
}
void Start () {
//通过listener来接收服务器端的相应
peer = new PhotonPeer(this,ConnectionProtocol.Udp);
//连接服务器 发起连接
peer.Connect("127.0.0.1:5055", "MyGame1");
}
void Update () {
peer.Service(); //检测有没有 发起请求 无论什么状态下
//peer.Service();
}
void OnDestroy()
{
if (peer!=null&&(peer.PeerState==PeerStateValue.Connected)) // 当peer不等于空 而且 正在运行的时候
{
peer.Disconnect();//断开连接
}
}
}