基于TCP 协议的RPC
前言:
环境:
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的更多相关文章
- dubbo基于tcp协议的RPC框架
什么是 RPC 框架 谁能用通俗的语言解释一下什么是 RPC 框架? - 远程过程调用协议RPC(Remote Procedure Call Protocol) 首先了解什么叫RPC,为什么要RPC, ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- 基于TCP协议的网络通信
TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信.Java对基于TC ...
- 浅析C#基于TCP协议的SCOKET通信
TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...
- 基于TCP协议的客户端
基于TCP协议的客户端 此客户端能用于下一篇博客的单线程服务器和多线程服务器 import java.io.BufferedReader; import java.io.IOException; im ...
- 用c++开发基于tcp协议的文件上传功能
用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...
- 网络编程应用:基于TCP协议【实现对象传输】--练习
要求: 基于TCP协议实现,客服端向服务器发送一个对象 服务器接受并显示用户信息 ,同时返回给客户端 "数据已收到" 建一个Student类,属性:name age Student ...
- 网络编程应用:基于TCP协议【实现文件上传】--练习
要求: 基于TCP协议实现一个向服务器端上传文件的功能 客户端代码: package Homework2; import java.io.File; import java.io.FileInputS ...
- 网络编程应用:基于TCP协议【实现一个聊天程序】
要求: 基于TCP协议实现一个聊天程序,客户端发送一条数据,服务器端发送一条数据 客户端代码: package Homework1; import java.io.IOException; impor ...
随机推荐
- Kubernetes---pod--重启策略
restartPolicy: Always: 默认 , 总是重启 OnFailure : 错误事重启 Never: 从来不重启 Default to Always:
- Kubernetes因限制内存配置引发的错误
今天对一个pod进行内存资源调整后, 一直卡在ContainerCreating的状态, 执行describe命令查看该 Pod 详细信息后发现如下 . [root@master-01 ~]# kub ...
- Spring中的IOC_源码_随笔
Spring ioc 叫控制反转,也就是把创建Bean的动作交给Spring去完成. spring ioc 流程大致为 定位-> 加载->注册 先说几个比较有意思的点 1.Spring中 ...
- mogodb分片配置
下图展示了在MongoDB中使用分片集群结构分布: 上图中主要有如下所述三个主要组件: Shard: 用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个repli ...
- Java IO流读取文件
使用指定编码读取文件 public static String toString(File file, String charset){ StringBuilder result = new Stri ...
- node开发备注
设置环境变量 // 命令行启动: "scripts": { "start": "export NODE_ENV=dev && node ...
- 【java爬虫】---爬虫+jsoup轻松爬博客
爬虫+jsoup轻松爬博客 最近的开发任务主要是爬虫爬新闻信息,这里主要用到技术就是jsoup,jsoup 是一款 Java的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非 ...
- Zara精讲C#.Cache、它和Redis区别是什么???
前言:今天在博客园看到大佬在用Cache,非常不懂,原来它是搞缓存的,原来我只知道Redis是搞这个的,才知道有这个玩腻. 那它们的区别是什么呢?? 区别: redis是分布式缓存,是将数据随机分配到 ...
- 基于winserver部署Apollo初次体验(附.net客户端demo)
前言 配置中心伴随着这几年分布式系统演变和微服务架构的兴起,已经成为必不可少的需求之一.试下一下如果哪天公司的所有应用服务,从公司服务器迁移到云服务,成千上万的配置,修改起来是多么耗时费劲的事(我们公 ...
- 【朝花夕拾】Lint使用篇
工作中Lint工具使用实录及整理 AndroidStudio内置的Lint工具,对app中的代码规范带来了极大的方便.对内存泄漏.代码冗余.代码安全.国际化.代码规范等很多方面都能检测,是 ...