网站开发设计资讯,百度投放广告一天多少钱,网站空间安装,wordpress小工具迁移如今的游戏开发#xff0c;不搞个跨服玩法都不好意思说在做游戏了#xff08;当然#xff0c;也跟游戏类型有关#xff0c;一些轻度休闲游戏可以排除在外#xff09;。跨服玩法的设计#xff0c;可以进一步激发玩家追求高战力的虚荣心#xff0c;也可以汇聚玩家数量不搞个跨服玩法都不好意思说在做游戏了当然也跟游戏类型有关一些轻度休闲游戏可以排除在外。跨服玩法的设计可以进一步激发玩家追求高战力的虚荣心也可以汇聚玩家数量避免单服日活跃低呈现死服现象。
不同服务器的玩家由于数据不在同一个进程里所以无法直接交互。跨服设计的目标就是将不在同一个游戏进程的玩家拉到同一个服务器进程。
跨服玩法的技术本质其实是跨进程通信。服务器A跟服务器B进行数据交换。java常用的进程间通信有httprpcwebservice消息队列等等。
而跨服游戏设计最常用的是采用RPC以及原生socket通信。本文主要来讲述这两种方式的通信方式的区别。
rpc跨服通信
RPC远程过程调用简单来说就是一个进程A向另外一个进程B请求服务。进程A调用进程B的服务就好像在调用自己进程的服务方法一样无需关心内部的实现细节。RPC的使用demo如下面所示
RpcService(name HelloService)
public class HelloServiceImpl implements HelloService {OverrideRpcInvokerpublic String sayHi(String request) {return hi request;}}
客户端只需要引用HelloService接口其实现HelloServiceImpl由服务端提供实现。客户端可以直接以调用本地服务接口的方式调用服务提供者的功能。
rpc的优缺点
优点
简单易用RPC隐藏了底层通信细节使用起来简单方便。提高效率RPC可以将远程调用过程封装成一个接口并通过一定的序列化和反序列化机制将数据进行传输减少通信开销提高效率。提高可维护性RPC将远程服务封装成接口可以提高代码的可维护性和可拓展性。跨语言支持RPC协议通常是跨语言的可以实现不同语言之间的通信和调用。
缺点
依赖网络RPC需要依赖网络进行通信网络不稳定或延迟会影响调用效率和可靠性。难以跟踪问题由于RPC调用是在不同的进程上进行的一旦出现问题调试和跟踪问题会比在本地调用困难。安全性RPC通信可能会存在安全隐患需要额外的安全机制来确保通信的安全性。版本兼容性当服务端接口发生变化时客户端需要做相应的升级或兼容处理增加了开发和维护的难度。
总体来说
RPC在简化开发、提高效率、可维护性和跨语言支持方面具有明显优势但同时也存在配置复杂、依赖网络、难以调试和安全性等缺点。在使用RPC时需要根据具体需求和情况进行权衡和选择。
socket通信
rpc专注于面型服务而socket则是面向底层传输通信。类似于http的请求——响应模式客户端发送一个请求消息给服务器服务器处理之后给予一个响应消息。
socket的优缺点
优点
简单易用Socket编程提供了一种简单而直接的方式来实现网络通信使得开发者可以自有地创建客户端和服务器端进行通信。灵活性Socket提供了底层的网络通信接口允许开发者自定义通信协议和数据格式从而可以满足各种不同的需求。跨平台性由于Socket是基于TCP/IP协议的因此可以在不同的操作系统和平台上进行通信具有较好的跨平台性。实时性Socket通信可以实现实时性要求较高的应用如在线游戏、实时聊天等。
缺点
复杂性在Socket编程中开发者需要处理网络通信的各种细节包括连接管理、数据传输、数据编解码数据粘包拆包、异常处理等相对比较复杂。性能Socket通信的性能受到网络环境和负载的影响可能出现延迟或带宽受限的情况影响通信效率。安全性Socket通信的安全性相对较低需要额外的加密和认证机制来确保通信的安全性。
总体来说
Socket在实现网络通信时具有简单易用、灵活性、跨平台性和实时性的优点但同时也存在复杂性、性能、安全性和编程复杂度等缺点。在使用Socket时需要根据具体的需求和情况进行权衡和选择。
特别是对于游戏开发来说需要比较下两者的优缺点
游戏业务选择观点
socket与rpc对比 socketrpc使用方式服务端收到客户端请求包后返回响应包客户端面向服务接口使用简单传输细节双方需要关注数据的传输过程 无须关心底层通信 同步调用客户端调用过程可以同步调用亦可异步调用客户端同步调用会阻塞当前线程
笔者认为说到底rpc只是在通信传输的上层封装了服务而已其底层主要是socket。当然也有底层使用http的实现例如Hession。游戏服务器使用socket来接受所有客户端的请求本身有一个非常完善的跨进程通信框架。而不同服务器节点的跨服通信本质跟客户端与服务器的通信一样的所以无须再引入第三方rpc框架。而且基于socket的通信可以实现类似于rpc的请求——响应模式也可以实现异步的消息回调。参考以下接口
public class RpcMessageClient {/*** 以消息回调的方式请求数据* 发送方无须阻塞当前线程*/public static void callBack(IdSession session, Traceable request, RequestCallback callBack) throws CallbackTimeoutException {}/*** 以请求——响应的方式请求数据* 发送方必须阻塞当前线程*/public static Object request(IdSession session, Traceable request) throws CallbackTimeoutException {}}
具体代码可参考笔者的游戏服务器开源框架
jforgame游戏服务器开源框架