本文将对NHibernate数据进行简单封装,方便在PhotonServer服务器中进行调用
[csharp] view plain copy
using NHibernate
using NHibernate.Cfg
using MyGameServer.Domain
using NHibernate.Criterion
using System.Collections.Generic
namespace MyGameServer.Helper
{
public static class NHibernateHelper
{
private static ISessionFactory sessionFactory = null
private static ISession session = null
public static ISession GetSession
{
get
{
if (sessionFactory == null)
{
Configuration cfg = new Configuration()
//解析固定路径配置文件nhibernate.cfg.xml
cfg.Configure()
//映射目标程序集 解析映射文件 Student.xml ......
cfg.AddAssembly(typeof(Student).Assembly)
//获取会话对象
sessionFactory = cfg.BuildSessionFactory()
}
session = sessionFactory.OpenSession()
return session
}
private set { }
}
//添加行
public static void AddData<T>(T t)
{
using (ISession session = GetSession)
{
using (ITransaction transaction=session.BeginTransaction())
{
GetSession.Save(t)
transaction.Commit()
}
}
}
//添加列
public static void RemoveData<T>(T t)
{
using (ISession session = GetSession)
{
using (ITransaction transaction = session.BeginTransaction())
{
GetSession.Delete(t)
transaction.Commit()
}
}
}
//通过ID获取对象
public static T GetDataById<T>(int id)
{
using (ISession session = GetSession)
{
using (ITransaction transaction = session.BeginTransaction())
{
T t = session.Get<T>(id)
transaction.Commit()
return t
}
}
}
/// <summary>
/// 通过名称获取对象
/// </summary>
/// <typeparam name="T">需要获取的对象</typeparam>
/// <param name="dataBaseName">在数据库中的列名称</param>
/// <param name="targetName">获取对象的目标名</param>
/// <returns></returns>
public static T GetDataByName<T>(string dataBaseName, string targetName)
{
using (ISession session = GetSession)
{
T t = session.CreateCriteria(typeof(T)).Add(Restrictions.Eq(dataBaseName, targetName)).UniqueResult<T>()
return t
}
}
/// <summary>
/// 得到表内的全部对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static ICollection<T> GetAllUsers<T>()
{
using (ISession session = GetSession)
{
IList<T> ts = session.CreateCriteria(typeof(T)).List<T>()
return ts
}
}
//查询是否有符合id和姓名相同的对象
public static bool VerifyUser<T>(params object[] arg)
{
using (ISession session = GetSession)
{
T t = session
.CreateCriteria(typeof(T))
.Add(Restrictions.Eq(arg[0].ToString(), arg[1]))//类属性名 属性值
.Add(Restrictions.Eq(arg[2].ToString(), arg[3]))
.UniqueResult<T>()
if (t == null)
{
return false
}
return true
}
}
/// <summary>
/// 更新数据表
/// </summary>
/// <typeparam name="T">数据表映射的对象</typeparam>
/// <param name="t"></param>
public static void UpdateData<T>(T t)
{
using (ISession session = GetSession)
{
using (ITransaction transaction=session.BeginTransaction())
{
session.Update(t)
transaction.Commit()
}
}
}
}
}
在主函数调用
[csharp] view plain copy
using NHibernate
using NHibernate.Cfg
using LJL.Domain
using LJL.Helper
namespace LJL
{
class Program
{
static void Main(string[] args)
{
Student sd = new Student { mID = 6, mName = "小张", mScore = 10 }
NHibernateHelper.AddData(sd)
}
}
}
运行程序,一切正常,打开SQLyog,在student数据表中添加一行数据
接下来就是在PhotonServer中调用,来实现与MySQL数据库交互
按图下将类、配置文件集成到类库中(注意需要修改下类和配置文件中的程序集及命名空间)
接下来就是在Unity3d游戏客户端中与PhotonServer通信进而访问本地数据库
在Unity3d客户端上创建UI(这里简单拖入输入框和按钮)
如下图创建脚本
我们的游戏有很多中请求(比如登入、注册请求等等)
所以都继承自BaseRequest
[csharp] view plain copy
using ExitGames.Client.Photon
using System.Collections
using System.Collections.Generic
using UnityEngine
public abstract class BaseRequest : MonoBehaviour
{
[HideInInspector]
//该请求的 *** 作类型
public Collective.OperationMode operationMode = Collective.OperationMode.Default
public virtual void Start() { }
public abstract void OnOperationRequest()
public abstract void OnOperationResponse(OperationResponse operationResponse)
}
这里博主简单的做了一下登录请求
[csharp] view plain copy
using ExitGames.Client.Photon
using System.Collections
using System.Collections.Generic
using UnityEngine
using UnityEngine.UI
public class LoginRequest : BaseRequest
{
//用户名
private InputField mInputName
//密码
private InputField mInputPassword
public override void Start()
{
operationMode = Collective.OperationMode.LOGIN
GameContext.GetInstance.AddRequest(this)
mInputName = GameObject.Find("IDInputField").GetComponent<InputField>()
mInputPassword = GameObject.Find("NameInputField").GetComponent<InputField>()
//登录按钮点击事件
GameObject.Find("LoginButton").GetComponent<Button>().onClick.AddListener(() => { OnOperationRequest() })
}
public override void OnOperationRequest()
{
GameContext.GetInstance.peer.OpCustom(
(byte)this.operationMode,
new Dictionary<byte, object> { { (byte)Collective.ParameterMode.NAME, mInputName.text }, { (byte)Collective.ParameterMode.PASSWORD, mInputPassword.text } },
true
)
}
public override void OnOperationResponse(OperationResponse operationResponse)
{
Collective.OperationResult resultCode = (Collective.OperationResult)operationResponse.ReturnCode
if (resultCode == Collective.OperationResult.SUCCESS)
{
//登录成功
Debug.Log("用户登录成功")
}
else if(resultCode == Collective.OperationResult.FAIL)
{
//登录失败
Debug.Log("登录失败")
}
}
}
最后附上上篇博文GameContext脚本,在这里有些地方发生了更新
[csharp] view plain copy
using System.Linq
using System.Collections.Generic
using UnityEngine
using UnityEngine.UI
using ExitGames.Client.Photon
public class GameContext : MonoBehaviour,IPhotonPeerListener
{
/// <summary>
/// 存储 *** 作类型与请求
/// </summary>
public Dictionary<Collective.OperationMode, BaseRequest> requestDic = new Dictionary<Collective.OperationMode, BaseRequest>()
public PhotonPeer peer
private static GameContext _instance
public static GameContext GetInstance
{
get
{
if (_instance == null)
{
_instance = GameObject.Find("GameContext").GetComponent<GameContext>()
}
return _instance
}
}
public void DebugReturn(DebugLevel level, string message)
{
}
//接收服务器发来的事件
public void OnEvent(EventData eventData)
{
switch (eventData.Code)
{
case 0:
//获取事件数据
object value = eventData.Parameters.FirstOrDefault(q => q.Key == 1).Value
Debug.Log(value.ToString())
break
default:
break
}
}
//接收响应数据(客户端发送了请求)
public void OnOperationResponse(OperationResponse operationResponse)
{
BaseRequest request = requestDic.FirstOrDefault(q => q.Key == (Collective.OperationMode)operationResponse.OperationCode).Value
if (request != null)
{
request.OnOperationResponse(operationResponse)
}
else
{
//获取响应数据失败
Debug.LogError("获取响应数据失败")
}
}
//连接状态发送改变
public void OnStatusChanged(StatusCode statusCode)
{
Debug.Log("数据连接状态发生的改变:" + statusCode)
}
private void Start()
{
//传输协议UDP 、 通过Listener接收服务器端的响应
peer = new PhotonPeer(this, ConnectionProtocol.Udp)
//连接本地服务器
peer.Connect("127.0.0.1:5055", "MYGameServer")
}
private void Update()
{
//和服务器实时保持数据连接
peer.Service()
}
private void OnDestroy()
{
if (peer != null && peer.PeerState == PeerStateValue.Connected)
{
//断开连接
peer.Disconnect()
}
}
public void AddRequest(BaseRequest request)
{
光子网络是一种适用于以太坊和光谱区块链上ERC20 token和ERC223 token的链下支付网络,具有快速、可扩展和低成本的特点,并提供了与区块链类似的安全性和去中心化保证。在兼容性方面,光子网络不仅可以在windows、Linux、macOS等平台上运行,而且支持Android、iOS等移动平台;为适配移动平台安全性和稳定性需求,光子网络采用精简状态恢复、异步响应及Matrix集群通信机制,提升了移动微支付的用户体验。更进一步,在光谱生态meshbox的支持下,光子网络还可以进行更有效的链接支付以及直接通道无网支付,解决网络信号不佳及网络拥堵等场景下的支付需求。最后,光子网络还提供了跨链token 原子互换以及较完善的第三方服务支持,包括:与比特币、莱特币、以太坊、SMT的两两跨链互换,第三方代理服务帮助离线节点监控通道资金安全,第三方路由查找服务提供路由查询及通道收费等,光子网络将与光谱生态一起构建价值传输的桥梁,为真正万物互联奠定坚实的基础。
2.1 基础功能
光子网络的基础功能包括:通道打开、通道存款、链下直接通道转账、链下间接通道转账、通道关闭、通道更新、通道结算。简要描述基础功能使用场景如下:假设有三个用户Alice、 Bob和Charlie想使用光子网络进行链下转账交易。以Alice发给Bob、Alice发送给Chalie为例:Alice打算转账30个token给Bob,转账20token给Charlie。简单支付过程会是什么样呢?
第一步,打开通道。如果Alice和Bob是第一次使用photon network进行转账交易,他们之前没有直接通道相连。那么对于交易发起者Alice来说, 她需要先使用打开通道功能,在Alice和Bob之间建立一条通道。此时,双方建立的通道内没有token,Alice和Bob可以在通道建立后,单独进行存款 *** 作,也可以在建立通道的同时,存一部分token进通道内。完成了打开通道,就可以使用新建的通道。同理,Alice也可以与Charlie打开通道,Bob也可以与Charlie打开通道,我们假设是Bob与Charlie打开了通道。
第二步,存款进通道。如果Alice在第一步通道创建时没有进行存款,为了能够给Bob进行转账,则Alice需要使用通道存款功能,向新创建的通道存入一定数量的token,存款 *** 作可以重复进行多次,Alice和Bob都可以向通道内存款。假定现在Alice向Alice<——>Bob通道存了100 token进通道,则目前Alice<——> Bob通道总容量为100 token,其中Alice为100 token,Bob为0 token。此外,Bob在Bob<——> Charlie通道内也存入80 token。
第三步,链下转账。在光子网络的支持下,Alice可以向Bob发送30token的转账,因为目前Alice和Bob之间存在直接通道,并且在通道内Alice有100 token的余额,因此,直接通道转账成功。转账完成后,Alice的存款为70token,Bob的存款为30token,此时,因为交易成功发送,没有锁定token。Alice向Charlie发送20token的转账,因为Alice和Charlie之间没有直接通道,所以不能进行直接通道链下转账;但是,Alice和Bob,Bob和Charlie之间有直接通道,Alice可以通过Bob向Charlie进行间接通道转账。转账完成后,Alice<——>Bob通道内余额为Alice 50token,Bob 50tokenBob<——>Charlie通道内余额为Bob 60token,Charlie 20token。
第四步:关闭通道。Alice在与Bob交易完成后,不想再继续使用她们之间的这条通道,想取回通道内的资金,此时Alice可以使用关闭通道功能单方面关闭这条通道,并等待通道更新后进行结算。
第五步:更新通道。Alice为了不损失钱,在通道关闭的同时需要提交最新的余额证明,更新对方给自己的转账金额;同样,Bob得知Alice打算关闭他们之间的通道,为了防止自己受损失,Bob也需要使用更新通道功能,提交Alice转账给自己的证明,双方更新通道余额(并解锁已注册锁的交易)后,可以进行通道结算。
第六步:结算通道。双方在结算窗口期后,任意一方可以使用通道结算功能将通道内的资金返还回双方各自的链上帐户中。如Alice 50token ,Bob 50token。结算完成后,Alice<——> Bob这条通道将被销毁。
2.2 特色功能
在基础功能之外,光子网络还有以下一些特色功能。
(1)合作关闭通道
在大部分的情况下,通道的双方是合作的。因此,单方关闭通道等待超时增加了复杂度和花费。为了提高效率,光子网络增加了合作关闭通道功能,通道双方只需要签名表示同意最终状态。双方合作关闭通道,可以立即进行结算,顺利情况下可以在20秒内,将 token 返回到各自账户上。
(2)不关闭通道取现
通道参与双方通过协商一致,在不关闭通道的情况下,可以从通道中提取一部分资金到自己的链上账户。光子网络为了防止重放攻击,在取钱后重新设置通道打开的区块数,防止取钱后一方使用旧的余额证明关闭通道获取额外利益。
(3)更完善的第三方支持
光子网络提供第三方代理服务,支持代理提交余额证明,代理解锁等功能,并可延伸支持代理创建通道、代理存款等功能,通道参与双方可以在没有光谱(以太坊)的情况下(离线)进行创建通道等 *** 作,并且保证自身利益的安全;光子网络提供第三方路由查找服务,优化路由计算效率和准确率以提高转账成功率,同时实现通道收费功能,激励中间节点以提升光子网络整体使用效能。
(4)引入惩罚机制
为了提高路由效率及资金的利用率,光子网络设计了交易声明放弃方式取代交易双方互锁方式,中转节点声明放弃余额不足的转账,从通道双方的锁集合中移除这个转账,由前向节点重选路由转发。如果放弃锁的节点在结算前对已放弃的锁重新解锁,光子网络将对不诚实的路由中间节点进行惩罚。
(5)密码注册
光子网络新增密码链上注册功能,通过链上密码注册时间判断交易是否过期,未完成的短期交易(锁超时)只要有密码(secret)已经注册即可认为安全,资金通道利用率更高,不会因为某个交易失败,而造成通道关闭。
(6)支持 ERC223 token
ERC223 token标准在现有的ERC20标准基础引入了一些新功能,如防止意外转账的发生等。目前已有部分token支持ERC223标准,为了使光子网络更具普遍应用价值,相应增加了对ERC223 token的支持。
(7)支持 ERC20 扩展 ApproveAndCall
增加ApproveAndCall 接口可以对token逻辑和业务逻辑 *** 作进行简化,光子网络为适应更多token的调用需要,已增加ApproveAndCall扩展,支持多种模式的调用。
三、 光子网络(photon network)优点
光子网络最主要的功能是进行链下微支付,具有安全、快速、可扩展和低费用的优点。此外,光子网络与其他的状态通道相比,还具有以下一些优点:
(1)广泛的跨平台和移动适配应用
现有的一些状态通道技术实现多基于特定的平台,目前能够实现跨平台功能应用的相对较少,光子网络采用go语言开发,可以在windows、Linux、macOS等平台上运行。另外,光子网络设计的应用场景之一是目前应用广泛的移动端和智能设备,因此可以完全适配Android和iOS等移动端系统。光子网络为了提高移动设备的通信稳定性和更好的用户体验,使用Matrix消息框架进行底层通信,此集群管理方案在普通的硬件支持下可达每秒百万级别的吞吐量,其点对点通信在稳定可靠(均需签名和加密)的room内进行,可实时监控节点的状态并提供高效的通信效能。
(2)精简的安全保护(状态恢复)机制
为了保证交易过程的正常进行,以及更好的适配移动设备,光子网络对交易中可能出现的意外场景进行了分析并针对性的设计了解决方案,实现交易节点状态数据的同步以保护交易安全。为了避免交易过程中出现意外造成移动设备存储过多信息,光子网络没有采取所有情况都可以继续交易的机制(这样会存储大量数据,对移动设备的使用效率会有较大影响),在确保意外节点重启后不会丢失token,通道仍可以继续使用的原则上设计了精简状态恢复机制,整体上保护了交易的安全。
(3)日趋完善的第三方支持
光子网络从安全和效率的角度提供了多个第三方支持,当前的第三方支持包括第三方代理和第三方路由服务,第三方代理可以帮助委托方监控通道状态,并在通道另一方关闭通道结算时更新通道状态,对移动节点离线后资金的安全有良好的保证;第三方路由服务接收当前所有节点的通道状态和收费信息,可实时监控节点的状态并提供当前最优的路由及收费方案来提高转账成功率。目前,第三方服务正进一步完善性能并集成进光子网络,方便用户对光子网络的使用。
(4)特殊应用场景支持
无网和跨链是光子网络的亮点。在meshbox的支持下,光子网络可以在不依赖互联网(公链)的情况下进行直接通道无网安全支付,在网络信号不佳和网络拥堵的场景下有现实的应用需求;此外,光子网络可以在不借助第三方的情况下实现链下原子资产转换,对应应用广泛的跨链市场需求。光子网络针对无网和跨链设计了相应的接口和使用流程,初步解决了用户在特殊场景下支付和交换难题。
源码地址: https://github.com/SmartMeshFoundation/Photon
开发文档: https://photonnetwork.readthedocs.io/en/latest
Photon OS默认关闭了Root SSH登陆。编辑sshd_config。
设置PermitRootLogin为Yes后重启ssh服务就可以登陆了。
参考链接:
https://github.com/vmware/photon/wiki/Frequently-Asked-Questions#q-why-cant-i-ssh-in-as-root
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)