前言:

环境:
windown 10
Eclipse
JDK 1.8
RPC的概念:
RPC 是远程过程调用,是分布式网站的基础。

实验

SayHelloService.java 接口类,用于规范

SayHelloServiceImpl.java,是SayHelloService 的实现类

Provider.java 是服务的提供类

Consumer.java 是服务的消费类

SayHelloService.java

package cn.szxy;

/**
* 接口
*
*/
public interface SayHelloService {
/**
* 返回一个字符串
* @param str
* @return
*/
public String sayHello(String str);
}

SayHelloServiceImpl.java

package cn.szxy;

/**
* 实现类
*
*/
public class SayHelloServiceImpl implements SayHelloService{ @Override
public String sayHello(String str) {
if(str.equals("Hello")){
return "Hello 你好";
}else{
return "byebye!";
}
} }

服务提供类 Provider.java


package cn.szxy; import java.io.IOException;
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; /**
*
* 基于TCP协议的 服务提供端
*
*/
public class Provider{ public static void main(String[] args) throws Exception {
HashMap<Object, Object> map = new HashMap<>();
map.put(SayHelloService.class.getName(), new SayHelloServiceImpl()); //创建 socket 对象
ServerSocket server = new ServerSocket(5555);
System.out.println("服务器已启动....");
while(true){ //监听用户请求
Socket client = server.accept();
//获取输入流
ObjectInputStream ois = new ObjectInputStream(client.getInputStream()); String inferName = ois.readUTF();
String methodName = ois.readUTF();
Class<?>[] parameterTypes = (Class<?>[]) ois.readObject();
Object[] arguments = (Object[])ois.readObject(); //执行调用
Class<?> serviceClass = Class.forName(inferName);
Object service = map.get(inferName);
Method method = serviceClass.getMethod(methodName, parameterTypes);
//执行方法,并返回结果
Object result = method.invoke(service, arguments); System.out.println("要发送处理的结果: "+result); //获取输出流
ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
oos.writeObject(result);
oos.writeUTF("调用结束");
oos.flush();
;
}
}
}

服务消费类 Consumer

package cn.szxy;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.Socket;
import java.util.Scanner;
/**
*
* 基于 TCP的服务器消费端
*
*
*/
public class Consumer{ public static void main(String[] args) throws Exception { //获取需要发送的东西
String interName = SayHelloService.class.getName();
Method method = SayHelloService.class.getMethod("sayHello", String.class);
Object[] argurements = {"Hello"}; //创建 socket 对象
Socket client = new Socket("127.0.0.1",5555);
//获取输出流
ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
oos.writeUTF(interName);
oos.writeUTF(method.getName());
oos.writeObject(method.getParameterTypes());
oos.writeObject(argurements); //刷新缓冲区,不然会出现”连接重置 connection reset 找不到资源 “的问题
oos.flush(); //获取输入流
ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
Object result = ois.readObject();
String str = ois.readUTF();
System.out.println("RPC远程调用结果: ");
System.out.println(result); //关闭连接
client.close();
}
}

总结

 RPC 是基于 Java 的Socket的基础上,利用 socket 和 IO流将服务消费端需要调用的类和类中方法以及方法的参数发送给服务提供端
服务提供端接受了服务消费端的请求,利用反射技术将对应需要的方法执行并返回结果,发送给服务消费者。

基于TCP 协议的RPC的更多相关文章

  1. dubbo基于tcp协议的RPC框架

    什么是 RPC 框架 谁能用通俗的语言解释一下什么是 RPC 框架? - 远程过程调用协议RPC(Remote Procedure Call Protocol) 首先了解什么叫RPC,为什么要RPC, ...

  2. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  3. 基于TCP协议的网络通信

    TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信.Java对基于TC ...

  4. 浅析C#基于TCP协议的SCOKET通信

    TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...

  5. 基于TCP协议的客户端

    基于TCP协议的客户端 此客户端能用于下一篇博客的单线程服务器和多线程服务器 import java.io.BufferedReader; import java.io.IOException; im ...

  6. 用c++开发基于tcp协议的文件上传功能

    用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...

  7. 网络编程应用:基于TCP协议【实现对象传输】--练习

    要求: 基于TCP协议实现,客服端向服务器发送一个对象 服务器接受并显示用户信息 ,同时返回给客户端 "数据已收到" 建一个Student类,属性:name age Student ...

  8. 网络编程应用:基于TCP协议【实现文件上传】--练习

    要求: 基于TCP协议实现一个向服务器端上传文件的功能 客户端代码: package Homework2; import java.io.File; import java.io.FileInputS ...

  9. 网络编程应用:基于TCP协议【实现一个聊天程序】

    要求: 基于TCP协议实现一个聊天程序,客户端发送一条数据,服务器端发送一条数据 客户端代码: package Homework1; import java.io.IOException; impor ...

随机推荐

  1. [Swift]LeetCode986. 区间列表的交集 | Interval List Intersections

    Given two lists of closed intervals, each list of intervals is pairwise disjoint and in sorted order ...

  2. openstack快速安装之packstack

    最简单的openstack安装方式之packstack 一.环境准备 我们安装的是all-in-one环境的openstack,测试机IP:192.168.1.10 [root@openstack ~ ...

  3. Visual Studio 2017 怎么将自动生成属性设置为旧版格式

    工具:Visual Studio 2017 1.点击工具,进入选项 2.选项窗口左侧找到C#--代码样式,点击 3.找到表达式首选项中:使用属性的表达式主体.使用索引器的表达式主体和使用访问器的表达式 ...

  4. Guava 源码分析(Cache 原理 对象引用、事件回调)

    前言 在上文「Guava 源码分析(Cache 原理)」中分析了 Guava Cache 的相关原理. 文末提到了回收机制.移除时间通知等内容,许多朋友也挺感兴趣,这次就这两个内容再来分析分析. 在开 ...

  5. Android Native crash日志分析

    在Android应用crash的类型中,native类型crash应该是比较难的一种了,因为大家接触的少,然后相对也要多转几道工序,所有大部分对这个都比较生疏.虽然相关文章也有很多了,但是我在刚开始学 ...

  6. Chapter 5 Blood Type——21

    "Bella." Edward's voice was right beside me, relieved now. "Can you hear me?" “B ...

  7. Chapter 5 Blood Type——2

    The rest of the morning passed in a blur. 早上剩下的时间都在模糊中度过了. It was difficult to believe that I hadn't ...

  8. 使用logdashboard查看可视化日志

    logdashboard 日志面板是我在Github写的一个开源项目,旨在让查看日志变的方便快捷.在线预览 现在功能有日志检索.趋势图.异常堆栈快速查看.日志详情等 logdashboard支持自定义 ...

  9. ELK-logstash案例实战之读取日志输出到elasticsearch

    简介:从日志文件中读取日志,输出到elasticsearch集群中 $ cd /home/es/logstash-/config $ vim test3_es.conf $ cd /home/es/l ...

  10. C语言实现链队列的初始化&进队&出队

    /*链表实现队列的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typed ...