第四章:使用Proxy代理让客户端服务端分工合作。

<基于1.8 Forge的Minecraft mod制作经验分享>

别被那个Proxy代理吓到,很简单的。

  1. 我们先讨论为什么要用Proxy代理:

    像打开新的UI这种操作,比如打开一个背包,每个玩家都有各自的背包,这个操作仅仅应该发生在客户端,服务端通常是不做图形上的操作的。而像发送一个消息广播之类的事件,则应该在服务端处理,客户端只负责接收。因此,我们有了区分当前运行的是客户端还是服务端的需求,以分别处理不同的事件。诚然,我们可以粗暴的每次用if来判定,但这样效率无疑是很低的。所以Proxy就派上用场了。

  2. 接下来讨论什么是Proxy,它是怎么解决上述问题的:

    Proxy的含义就是双面代理,通过为不同的运行端实例化不同的类,来使得不同端执行不同操作。这两个面、即两个类,通常分别叫做ClientProxy和CommonProxy,这个实例通常这么申明:public static CommonProxy proxy,并且ClientProxy必须继承自CommonProxy,这样才能用clientProxy初始化proxy实例。但这里有个疑问,就是ClientProxy里的方法是否需要Override并且super父类CommonProxy的方法。不过现在貌似没遇到过问题,那就先往后走吧。

  3. 好,现在上代码,看看实际中Proxy的用法:
    @SidedProxy(clientSide = "com.zhengxiaoyao0716.douromod.ClientProxy", serverSide = "com.zhengxiaoyao0716.douromod.CommonProxy")
    public static CommonProxy proxy;

    上面代码的含义:@SideProxy注释是用来标识代理器的,对下面的proxy实例加上了这个标识后,Forge开始时就会自动根据clientSide、serverSide指定的类(是的,要写上完整的包路径)来为其做不同的初始化。所以请注意:1、proxy不可为final(否则你让人家怎么初始化)2、不需要再手动将其初始化。

接下来的使用就很简单了,你可以把proxy当成一个接口,放心大胆的在其上调用方法,执行时会自动调用ClientProxy或CommonProxy类里面的方法。也不知道我说明白没有

老规矩Github:https://github.com/zhengxiaoyao0716/DouroMod,快来一起做啊!!!好吧我承认我写那么认真就是为了如果有一天我弃坑了,能有好心人把斗罗大坑填上。之前在贴吧里面遇到了一个曾经挖过这个坑的前辈,感慨良多啊

转载于:https://www.cnblogs.com/zhengxiaoyao0716/p/5914929.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用多种框架实现RPC客户端服务端,以下是一些常用的框架: 1. Apache Dubbo:Apache Dubbo是一种高性能、轻量级的Java RPC框架,支持服务治理和多种协议,如Dubbo协议、REST协议等。 2. Spring Cloud:Spring Cloud是一个基于Spring Boot的微服务框架,提供了丰富的服务治理功能,包括服务注册、发现、路由、负载均衡等。 3. gRPC:gRPC是Google开源的高性能、跨语言的RPC框架,使用Protocol Buffers作为序列化协议,支持多种语言,包括Java。 以下是一个使用Java实现RPC客户端服务端的基本步骤: 1. 定义RPC接口:在服务端客户端都需要定义一个接口,用于描述RPC的服务。 2. 编写服务端实现:实现RPC接口,并将其注册到RPC框架中,以便客户端能够调用。 3. 配置服务端:配置服务端的监听端口、协议等信息。 4. 编写客户端:创建一个RPC客户端对象,使用RPC框架提供的API来调用服务端的方法。 5. 配置客户端:配置客户端的连接信息,如服务端的IP地址、端口号、协议等。 6. 测试:启动服务端客户端,测试RPC调用是否成功。 以下是一个简单的示例代码: 1. 定义RPC接口 ```java public interface HelloService { public String sayHello(String name); } ``` 2. 编写服务端实现 ```java public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello, " + name; } } ``` 3. 配置服务端 ```java public class Server { public static void main(String[] args) throws Exception { HelloService helloService = new HelloServiceImpl(); Server server = new NettyServer("localhost", 8888); server.registerService(helloService); server.start(); } } ``` 4. 编写客户端 ```java public class Client { public static void main(String[] args) throws Exception { Client client = new NettyClient("localhost", 8888); HelloService helloService = client.getProxy(HelloService.class); String result = helloService.sayHello("world"); System.out.println(result); } } ``` 5. 配置客户端 ```java public class NettyClient implements Client { private final String host; private final int port; private final EventLoopGroup group; public NettyClient(String host, int port) { this.host = host; this.port = port; this.group = new NioEventLoopGroup(); } @Override public <T> T getProxy(Class<T> clazz) { return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, new RpcInvocationHandler(host, port, group)); } } ``` 6. 测试 启动服务端客户端,运行Client的main方法,输出结果为:Hello, world。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值