服务提供者:
public interface EchoService {
String echo(String ping);
}
public class EchoServiceImpl implements EchoService{
@Override
public String echo(String ping) {
return ping != null ? ping +"--> i am ok." : " I am ok.";
}
}
服务器发布者:
/**
* Created by hailong on 2016/11/18.
* 服务器发布者
*/
public class RpcExporter {
public static Executor executor =
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
public static void exporter(String hostName, int port) throws Exception {
// 建立socket服务端
ServerSocket server = new ServerSocket();
// 绑定socket与地址端口,在RPC服务发布者
server.bind(new InetSocketAddress(hostName, port));
try {
while (true) {
// 线程中,接收要来自客户端的请求
executor.execute(new ExporterTask(server.accept()));
}
} finally {
server.close();
}
}
// 新启动线程接收来自客户端的请求
private static class ExporterTask implements Runnable
{
Socket client = null;
public ExporterTask(Socket client)
{
this.client = client;
}
public void run(){
ObjectInputStream input = null;
ObjectOutputStream output = null;
try{
input = new ObjectInputStream(client.getInputStream());
//将客户端发送的码流反序列化成对象
String interfaceName = input.readUTF();
Class<?> service = Class.forName(interfaceName);
String methodName = input.readUTF();
Class<?>[] parameterTypes = (Class<?>[])input.readObject();
Object[] arguments = (Object[])input.readObject();
Method method = service.getMethod(methodName, parameterTypes);
// 反射调用服务实现者,获取执行结果。
Object result = method.invoke(service.newInstance(), arguments);
output = new ObjectOutputStream(client.getOutputStream());
// 执行结果反序列化,通过socket发送给客户端。
output.writeObject(result);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if (output != null)
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
if (input != null)
try {
input.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
if(client != null) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
客户端本地服务:
/**
* Created by hailong on 2016/11/18.
* 客户端本地服务
*/
public class RpcImporter<S> {
public S importer(final Class<?> serviceClass, final InetSocketAddress addr) {
// 本地客户端的接口调用转换成JDK动态代理,在动态代理中实现远程调用
return (S) Proxy.newProxyInstance(serviceClass.getClassLoader(),
new Class<?>[] {serviceClass.getInterfaces()[0]},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Socket socket = null;
ObjectOutputStream output = null;
ObjectInputStream input = null;
try{
socket = new Socket();
socket.connect(addr);
output = new ObjectOutputStream(socket.getOutputStream());
//RPC服务接口值设定到输出流(EchoServiceImpl.class)
output.writeUTF(serviceClass.getName());
//设定方法名echo
output.writeUTF(method.getName());
output.writeObject(method.getParameterTypes());
output.writeObject(args);
input = new ObjectInputStream(socket.getInputStream());
return input.readObject();
}
finally{
if (socket != null) {
socket.close();
}
if(output != null) {
output.close();
}
if (input != null) {
input.close();
}
}
}
});
}
}
测试类:
public class RpcTest {
public static void main (String[] args) throws Exception {
// RPC服务器发布者
new Thread(new Runnable() {
@Override
public void run() {
try {
// 建立RPC服务发布者
RpcExporter.exporter("localhost", 8088);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
// RPC客户端
RpcImporter<EchoService> importer = new RpcImporter<EchoService>();
// RPC客户端访问RPC服务器接口
EchoService echo = importer.importer(EchoServiceImpl.class,
new InetSocketAddress("localhost",8088));
System.out.println(echo.echo("Are you ok ?"));
}
}
分享到:
相关推荐
C语言利用socket套接字实现客户端和服务器端TCP通信实例代码。C语言利用socket套接字实现客户端和服务器端TCP通信实例代码。
workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP... workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。
workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP... workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。
RPC研究,从浅到深,含研究笔记:超级全面,包懂。代码分等级,从最简单的socket通信,到通过代理获取;再到动态代理;代理接口不暴露;以及序列化方式对比;以及大数据框架下的rpc通信应用。自己整理了很久,超值!
被广泛的用于手机app、手游服务端、网络游戏服务器、聊天室服务器、...workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。
使用这个库,您可以轻松地将事件驱动的网络功能添加到您的 Flash 应用程序中,而无需处理低级细节。 高性能和低延迟是通过使用持久性 TCP/IP 套接字和 Flash 的本机序列化格式 (AMF) 实现的。 由于使用 AMF,您可以...
9.3.3 在程序中创建拨号连接 9.3.4 状态通知 9.4 RAS高级开发拨号程序 9.4.1 创建工程项目 9.4.2 关键代码分析 第10章 传真高级编程 10.1 传真编程的基础知识 10.1.1 T.30传真通信协议 10.1.2 HDLC信息包 ...
基于netty和zookeeper的RPC框架说明nzRpc是一个基于netty和zookeeper的RPC框架,使用netty作为底层socket通信框架。使用Zookeeper作为注册中心。服务提供者启动时会向服务注册中心注册相关信息消费者启动时,会获取...
目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。 2. 从通信协议的层面 基于 HTTP 协议的(例如基于...
主要应用于不同的系统之间的远程通信和相互调用。 比如有两个系统,一个是PHP写的,一个是JAVA写的,而PHP想要调用JAVA中的某个类的某个方法,这时候就需要用到RPC了。 怎么调?直接调是不可能,只能是PHP通过某种...
12.3.2 Rpcgen构建RPC应用 12.3.3 编写RPC说明文件 12.3.4 修改客户端程序 12.3.5 修改服务器端程序 12.3.6 调用的完整过程 12.3.7 程序的结果、分析和总结 本章小结 第四篇 高级...
了解java远程通讯技术的最好的文章, ...传输协议比较出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式
yaf-lib 基于 yaf 的应用开发框架, 简单的mvc中间层继承补充, 常用缓存、数据库等驱动类, 添加widget组件模块,及layout插件, rpc服务化,支持hprose、yar等, 支持xhprof性能调试。requirementphp 5.3 ...
31_gRPC在Nodejs领域中的静态代码生成及与Java之间的RPC通信 32_IO体系架构系统回顾与装饰模式的具体应用 33_Java NIO深入详解与体系分析 34_Buffer中各重要状态属性的含义与关系图解 35_Java NIO核心类源码解读与...
28_gRPC与Gradle流畅整合及问题解决的完整过程与思考 29_Gradle插件问题解决方案与Nodejs环境搭建 30_通过gRPC实现Java与Nodejs异构平台的RPC调用 31_gRPC在Nodejs领域中的静态代码生成及与Java之间的RPC通信 ...
此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、ICMP、redis、disque、memcache、beanstalk、handler socket),常见流式编解码库:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 等。 ### 2、acl 库...
随着网络技术、面向对象技术(OOT)的成熟,分布计算技术不再是实验室里的高新技术,分布计算...首先阐述分布计算机系统的概念,并分析在分布计算中,Socket通信协议和RPC的不足,然后论述如何使用Java RMI实现分布计算.
用于内部微服务通信的rpc服务器(websocket jsonrpc2.0) rpc客户端 WebSocket服务器生成器 HTTP / 2 自定义服务器生成器-例如,已实现Socket.IO 序列化ORM tmpfs(Ram基础)配置存储,通过neuconf工具更改运行...
第31讲:gRPC在Nodejs领域中的静态代码生成及与Java之间的RPC调用 第32讲:IO体系架构系统回顾与装饰模式的具体应用 第33讲:Java NIO深入详解与体系分析 第34讲:Buffer中各重要状态属性的含义与关系图解 第35...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...