用java实现基于Tcp协议系统间的简单RPC调用

1、第一步:用idea创建一个简单的demo

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、第二步:创建相应的包和类

在这里插入图片描述

(1)Server类实现:

package com.ctgu_zyj.rpc;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(1234);
        Map<Object,Object> services = new HashMap<Object,Object>();
        services.put(SayHelloService.class, new SayHelloServiceImpl());
        while(true){
            System.out.println("服务提供者启动,等待客户端调用…………");
            Socket socket = serverSocket.accept();

            //收到消息后进行解码
            ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
            String interfaceName = objectInputStream.readUTF();
            String methodName = objectInputStream.readUTF();
            Class<?>[] paramterTypes = (Class<?>[])objectInputStream.readObject();
            Object[] argments = (Object[])objectInputStream.readObject();
            System.out.println("客户端调用服务端接口"+interfaceName+"的"+ methodName+"方法");

            //根据解码结果调用本地的服务
            Class serviceClass = Class.forName(interfaceName);
            Object serivce = services.get(serviceClass);
            Method method = serviceClass.getMethod(methodName, paramterTypes);
            Object result = method.invoke(serivce, argments);

            //服务提供者发送result给服务调用者
            ObjectOutputStream stream = new ObjectOutputStream(socket.getOutputStream());
            stream.writeObject(result);
            System.out.println("服务端返回结果为"+result);
        }
    }
}

(2)Server类的服务类的接口类SayHelloService类:

package com.ctgu_zyj.rpc;

public interface SayHelloService {
    public String sayHello(String msg);
}

(3)接口实现类SayHelloServiceImpl:

package com.ctgu_zyj.rpc;

public class SayHelloServiceImpl implements SayHelloService {

    @Override
    public String sayHello(String msg) {
        if("hello".equals(msg)){
            return "hello client";
        }else{
            return "bye bye";
        }
    }
}

(4)创建用户类Consumer:

package com.ctgu_zyj.rpc;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.Socket;

public class Consumer {
    public static void main(String[] args) throws Exception {

        //构造需要调用的方法
        String interfaceName = SayHelloService.class.getName();
        Method method = SayHelloService.class.getMethod("sayHello",
                java.lang.String.class);
        Object[] argments = {"hello"};

        //发送调用信息到服务器端,调用相应的服务
        Socket socket = new Socket("127.0.0.1",1234);
        ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
        outputStream.writeUTF(interfaceName);
        outputStream.writeUTF(method.getName());
        outputStream.writeObject(method.getParameterTypes());
        outputStream.writeObject(argments);
        System.out.println("发送信息到服务端,发送的信息为:"+argments[0]);

        //服务返回的结果
        ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
        Object object = inputStream.readObject();
        System.out.println("服务返回的结果为"+object);
    }
}

3、第三步:准备运行项目

在这里插入图片描述
在这里插入图片描述

4、第四步:总结

简单来讲整个过程就是,Server服务提供端运行,将服务实例化后放在Services的Map当中,然后通过一个while循环不断地接受到来地请求,得到接受到地参数,然后再通过Java地反射取得服务接口所需要调用地方法,执行后再将结果返回给服务地消费者。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村头卖假发的小郑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值