在客户端发起与服务器的连接
首先在Unity3D里面导入photon unity客户端的dll,在photon文件目录下找到
Photon-OnPremise-Server-SDK_v4-0-29-11263\lib\Photon3Unity3D.dll
直接导入到unity的Plugins文件里面,然后创建一个空物体,命名为 PhotonEngine,并在上面创建一个脚本命名为PhotonEngine( 用来管理与服务器端的连接),打开脚本写入连接的信息。
using UnityEngine;
using ExitGames.Client.Photon;
public class PhotonEngine : MonoBehaviour,IPhotonPeerListener {
private static PhotonEngine Instance;
private static PhotonPeer peer;
public static PhotonPeer Peer//让外界可以访问我们的PhotonPeer
{
get
{
return peer;
}
}
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(this.gameObject);
}else if (Instance != this)
{
Destroy(this.gameObject);return;
}
}
// Use this for initialization
void Start () {
//连接服务器端
//通过Listender连接服务器端的响应
//第一个参数 指定一个Licensed(监听器) ,第二个参数使用什么协议
peer = new PhotonPeer(this,ConnectionProtocol.Udp);
//连接 UDP的 Ip地址:端口号,Application的名字
peer.Connect("127.0.0.1:5055", "MyGame1");
}
// Update is called once per frame
void Update () {
peer.Service();//需要一直调用Service方法,时时处理跟服务器端的连接
}
//当游戏关闭的时候(停止运行)调用OnDestroy
private void OnDestroy()
{
//如果peer不等于空并且状态为正在连接
if (peer != null && peer.PeerState == PeerStateValue.Connected)
{
peer.Disconnect();//断开连接
}
}
//
public void DebugReturn(DebugLevel level, string message)
{
}
//如果客户端没有发起请求,但是服务器端向客户端通知一些事情的时候就会通过OnEvent来进行响应
public void OnEvent(EventData eventData)
{
}
//当我们在客户端向服务器端发起请求后,服务器端接受处理这个请求给客户端一个响应就会在这个方法里进行处理
public void OnOperationResponse(OperationResponse operationResponse)
{
}
//如果连接状态发生改变的时候就会触发这个方法。
//连接状态有五种,正在连接中(PeerStateValue.Connecting),已经连接上(PeerStateValue.Connected),正在断开连接中( PeerStateValue.Disconnecting),已经断开连接(PeerStateValue.Disconnected),正在进行初始化(PeerStateValue.InitializingApplication)
public void OnStatusChanged(StatusCode statusCode)
{
}
}
这时候客户端与服务器的连接已经建立起来了。我们打开我们MyGame的服务器,然后把我们的unity运行起来,这时候我们打开服务器的日志就可以看到有客户端连接进来了!这个时候已经成功建立连接了
客户端向服务器发起请求(发送数据给服务器),服务器回应给客户端(发送数据给客户端)
下面我们就要处理客户端向服务器如何发起请求并传递数据给服务器。
首先在空对象PhotonEngine上再创建一个脚本我们叫做PhotonText,然后打开脚本写入
using System.Collections.Generic;
using UnityEngine;
public class PhotonText : MonoBehaviour {
void Update () {
//这里我们没点击一次就向服务器发起一次请求
if (Input.GetMouseButtonDown(0))
{
SendRequest();
}
}
void SendRequest()
{
Dictionary<byte, object> data = new Dictionary<byte, object>();
data.Add(1, 100);
data.Add(2, "ads你好啊");
// 参数1 opCode表示发起请求的编号,接收的时候便于找到 参数二客户端需要向服务器传递的数据,是否稳定(如果为false表示数据丢失一两条也没啥)
PhotonEngine.Peer.OpCustom(1, data, true);//这里我们测试所以先传递空数据过去
}
}
那么发送过去请求后,那么服务器怎么去接收呢,下面我们来看下,打开我的上一篇所写的服务器代码,在ClientPeer类里面有一个方法是专门处理客户端请求的方法的,那就是OnOperationRequest();所以我们在这个方法里去接受我们客户端的请求并且给客户端响应,怎么接收呢,来看看代码
//处理客户端的请求
protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
{
//OperationRequest封装了请求的信息
//SendParameters 参数,客户端向服务器传递过来的数据
//通过operationRequest获取到opCode请求,在客户端发起请求的时候我们设置了opCode为1
//因为客户端可能发起很多次请求,我们服务器要对每一次请求做相应的回应,所以需要相对应的opCode
switch (operationRequest.OperationCode)
{
case 1:
MyGameServer.log.Info("收到一个客户端的请求");
//得到客户端的数据并打印到服务器的日志里面
Dictionary<byte, object> data = operationRequest.Parameters;
object intValue;
data.TryGetValue(1,out intValue);
object StringValue;
data.TryGetValue(2, out StringValue);
MyGameServer.log.Info("从客户端得到数据:"+intValue.ToString()+StringValue.ToString());
//从服务器发送数据给客户端
OperationResponse opResponse = new OperationResponse(1);//给其指定一个opCode,区分不同的请求的响应
Dictionary<byte, object> data2 = new Dictionary<byte, object>();
data2.Add(1, 200);
data2.Add(2, "谢谢,我很好!");
opResponse.SetParameters(data2);
//这里接受到请求后需要给客户端一个回应
SendOperationResponse(opResponse, sendParameters);//通过这个方法给客户端一个响应
break;
default:
break;
}
}
这里服务器收到了客户端的请求并且给了客户端回应并且传递了数据给客户端那么我们又如何让客户端去接收这个回应与接收数据呢?在我们刚刚在unity3D的PhotonEngine脚本里面有一个方法专门接受服务器响应的方法OnOperationResponse();我们在这个方法中去接收就OK,同样也是用opCode去指定接受哪个回应.
//当我们在客户端向服务器端发起请求后,服务器端接受处理这个请求给客户端一个响应就会在这个方法里进行处理
public void OnOperationResponse(OperationResponse operationResponse)
{
switch (operationResponse.OperationCode)
{
case 1:
Debug.Log("收到了服务器端的响应");
//接受服务器的数据
Dictionary<byte, object> data = operationResponse.Parameters;
object intValue;object StringValue;
data.TryGetValue(1,out intValue);
data.TryGetValue(2,out StringValue);
Debug.Log("收到服务器的数据信息:"+intValue.ToString()+StringValue.ToString());
break;
default:
break;
}
}
这个时候我们就可以去测试下了,在服务器端重新生成下,并且重启MyGame服务器,打开日志,然后运行Unity3D.运行起来后可以看到日志里面客户端已经连接,然后我们左键点击Unity Game视角的屏幕,在服务器的日志上就可以看到收到一个客户端的请求并且从客户端得到了数据,然后再unity客户端里面也可以看到打印收到了服务器的响应并且接受到了服务器的数据
这个时候我们整个请求回应的流程就完成了。
从服务器给客户端直接发送事件SendEvent
这里我还是在处理客户端的请求的OnOperationRequest()方法里面写入,你也可以在其他方法中写入,这里传输给客户端的数据我继续用data2.
//客户端没有发送请求给服务器,服务器直接发送数据给客户端
EventData ed = new EventData(1);//客户端有opCode,那么服务器之间发送就需要eventCode,这我们也设置eventcode为1
ed.Parameters = data2;
SendEvent(ed,new SendParameters());
发送后我们直接在unity客户端里面的PhotonEngine类里面有一个方法OnEvent(),这个方法表示如果客户端没有发起请求,但是服务器端向客户端通知一些事情的时候就会通过OnEvent来进行响应
//如果客户端没有发起请求,但是服务器端向客户端通知一些事情的时候就会通过OnEvent来进行响应
public void OnEvent(EventData eventData)
{
switch (eventData.Code)
{
case 1:
Debug.Log("服务器直接发送了数据过来");
Dictionary<byte, object> data = eventData.Parameters;
object intValue; object StringValue;
data.TryGetValue(1, out intValue);
data.TryGetValue(2, out StringValue);
Debug.Log("收到服务器的数据信息:" + intValue.ToString() + StringValue.ToString());
break;
default:
break;
}
}
可以看到服务器直接发送看数据给客户端