前一章客户端与服务端连接成功,现在需要前后端进行数据传递。

一、前端发送消息。在项目Scripts目录中新建脚本 TestSer.cs。并挂载到相机上

二、客户端发送数据给服务端。编辑客户端代码 TestSer.cs。让鼠标点击时发送消息

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class TestSer : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{ } // Update is called once per frame
void Update()
{
//如果鼠标点击了
if (Input.GetMouseButtonDown())
{
SendRequest();
}
} void SendRequest()
{
Debug.Log("点击了------"); //包装需要发送的数据
Dictionary<byte, object> data = new Dictionary<byte, object>();
data.Add(, );
data.Add(, "clent to ser"); //向服务端发送数据,发送code是1,服务端需要用到
PhotonManager.Peer.OpCustom(, data, true);
}
}

三、服务端接收数据,并返回数据给客户端。编辑服务端代码 ClientPeer.cs。

using System.Collections.Generic;
using Photon.SocketServer;
using PhotonHostRuntimeInterfaces; namespace MyGameServer
{ public class ClientPeer : Photon.SocketServer.ClientPeer
{
//创建客户端
public ClientPeer(InitRequest initRequest) : base(initRequest)
{
} protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
{
MyGameServer.log.Info("Client---请求了---" + operationRequest.OperationCode); //通过opCode区分
switch (operationRequest.OperationCode)
{
//客户端测试数据发送的code是1,所以在1里面接收数据
case :
//接收客户端传来的数据
Dictionary<byte, object> data = operationRequest.Parameters;
object intValue;
data.TryGetValue(, out intValue);
object strValue;
data.TryGetValue(, out strValue); MyGameServer.log.Info("Client---客户端传的数据--" + intValue.ToString() + "---" + strValue.ToString()); //服务端返回数据给前端
//包装数据,发送代码为 1,前端取数据需要用到
OperationResponse opResult = new OperationResponse(); Dictionary<byte, object> datav2 = new Dictionary<byte, object>();
datav2.Add(, );
datav2.Add(, "server to Client"); opResult.SetParameters(datav2); MyGameServer.log.Info("Client---返回数据给客户端了---");
SendOperationResponse(opResult, sendParameters); //发送数据给前端 break;
case :
break;
default:
break;
}
} //处理客户端断开连接
protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
{
MyGameServer.log.Info("Client------断开了");
}
}
}

四、客户端接收服务端响应的数据。编辑客户端代码 PhotonManager.cs.

  /// <summary>
/// 客户端请求后,服务端响应,返回数据
/// </summary>
/// <param name="operationResponse"></param>
public void OnOperationResponse(OperationResponse operationResponse)
{
Debug.Log("Client----收到服务端返回的数据了" + operationResponse.OperationCode); switch (operationResponse.OperationCode)
{
//服务端返回的数据code是1,所以在1中接收服务端数据
case :
object intval;
object strVal; Dictionary<byte, object> data = operationResponse.Parameters; data.TryGetValue(, out intval);
data.TryGetValue(, out strVal); Debug.Log("Client--收到服务端返回的数据" + intval.ToString() + "-- " + strVal.ToString()); break;
case :
break;
default:
break;
}
}

五、测试。查看结果。

服务端日志:

到此,前端和后端相互通信就完成了。另外客户端不需要向服务端请求,服务端可以自动向客户端发送数据。

六、服务端主动发送数据(服务端主动推送到客户端)。

  (1)、添加服务端代码

                //Envent自动发起信息
Dictionary<byte, object> datav3 = new Dictionary<byte, object>();
datav3.Add(, "DeDeDe");
datav3.Add(, "server to Client"); EventData ed = new EventData(); //发送code是2
ed.Parameters = datav3;
SendEvent(ed, new SendParameters()); //自动发送数据给前端

为了方便测试,将这段代码放到服务端 ClientPeer.cs 文件中。在 OnOperationRequest() 方法中添加。

  

(2)、客户端接收数据 。客户端脚本 PhotoManager.cs 中方法 OnEvent() 接收服务端主动推过来的数据。

 /// <summary>
/// 服务端直接给客户端数据时,不需要向服务器请求
/// </summary>
/// <param name="eventData"></param>
public void OnEvent(EventData eventData)
{
switch (eventData.Code)
{
case :
break;
case :
//服务端发送的code是2
Dictionary<byte, object> data = eventData.Parameters; object intval;
object strVal; data.TryGetValue(, out intval);
data.TryGetValue(, out strVal); Debug.Log("Client--收到服务端返回的数据" + intval.ToString() + "-- " + strVal.ToString()); break;
default:
break;
;
}
}

前后端相互传递数据以及服务端主动推送数据到此完成。

参考文档:https://doc.photonengine.com/zh-tw/server/current/app-framework/an-app-from-scratch

参考视频:https://www.bilibili.com/video/av35109390/?p=46

Photon Server初识(六) --- 客户端与服务端消息传递的更多相关文章

  1. Photon Server初识(五) --- 客户端连接服务端

    准备:Unity开开发IDE. 一.新建Unity3D项目 导入包,在资源下新建目录 Plugins .在之前解压的SDK目录 lib中找到 Photon3Unity3D.dll,拖到新建的目前下 二 ...

  2. 实验09——java基于TCP实现客户端与服务端通信

    TCP通信         需要先创建连接 - 并且在创建连接的过程中 需要经过三次握手        底层通过 流 发送数据 数据没有大小限制        可靠的传输机制 - 丢包重发 包的顺序的 ...

  3. react+redux教程(六)redux服务端渲染流程

    今天,我们要讲解的是react+redux服务端渲染.个人认为,react击败angular的真正“杀手锏”就是服务端渲染.我们为什么要实现服务端渲染,主要是为了SEO. 例子 例子仍然是官方的计数器 ...

  4. [Java]Hessian客户端和服务端代码例子

    简要说明:这是一个比较简单的hessian客户端和服务端,主要实现从客户端发送指定的数据量到服务端,然后服务端在将接收到的数据原封不动返回到客户端.设计该hessian客户端和服务端的初衷是为了做一个 ...

  5. SignalR 实现web浏览器客户端与服务端的推送功能

    SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...

  6. 用PHP的socket实现客户端到服务端的通信

    服务端 <?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //本地IP $address = 'loca ...

  7. Java实现UDP之Echo客户端和服务端

    Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  8. Java实现TCP之Echo客户端和服务端

    Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  9. socket 通信 入门3 android 客户端 C# 服务端

    这是一个android端操控服务器的例子  就是发送简单指令到服务器  然后服务器响应什么的... 当然这里是未完成的  只是简单展示一下大致思路 首先连接建立起来后  服务端给客户端一条信息  告诉 ...

随机推荐

  1. luogu2885

    P2885 [USACO07NOV]电话线Telephone Wire 给出若干棵树的高度,你可以进行一种操作:把某棵树增高h,花费为h*h. 操作完成后连线,两棵树间花费为高度差*定值c. 求两种花 ...

  2. 第11组 Alpha事后诸葛亮

    第11组 Alpha事后诸葛亮   组长博客链接 https://www.cnblogs.com/xxylac/p/11924846.html 设想和目标 我们的软件要解决什么问题?是否定义得很清楚? ...

  3. Spring Security整合JWT,实现单点登录,So Easy~!

    前面整理过一篇 SpringBoot Security前后端分离,登录退出等返回json数据,也就是用Spring Security,基于SpringBoot2.1.4 RELEASE前后端分离的情况 ...

  4. sed中使用变量及变量中存在特殊字符‘/’处理

    sed中使用变量,普通的处理方式无法解析变量 如当前file文件中存在字符串pedis,现将其替换为redis [root@localhost work]# cat file pedis 如下两种替换 ...

  5. VUE数组操作方法的局限

    1.不能通过索引值直接设置一个项: vm.items[indexOfItem] = newValue 但是可以用set方法设置: Vue.set(example1.items,indexOfItem, ...

  6. Facebook币Libra学习-1.核心概念

    Libra区块链是一个基于Libra协议的加密认证的分布式数据库.本文将简略介绍Libra协议的核心概念.其详细说明请参阅Libra技术白皮书. Libra区块链由分布式的Validator节点网络维 ...

  7. git撤销某次提交

    1.查询提交记录.进入目录,查看某人在此目录下的commit: panxi@ww-bj-panxi MINGW64 [path]/Business (feature/v2.3) $ git log f ...

  8. XGBoost原理详解

    原文:https://blog.csdn.net/qq_22238533/article/details/79477547

  9. .Netcore 2.0 Ocelot Api网关教程(9)- QoS

    本文介绍Ocelot中的QoS(Quality of Service),其使用了Polly对超时等请求下游失败等情况进行熔断. 1.添加Nuget包 添加 Ocelot.Provider.Polly  ...

  10. socket之IO多路复用

    概述 目的:同一个线程同时处理多个IO请求. 本文以python的select模块来实现socket编程中一个server同时处理多个client请求的问题. web框架tornado就是以此实现多客 ...