`

socket通信在RPC中简单应用

阅读更多
服务提供者:
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通信实例代码。C语言利用socket套接字实现客户端和服务器端TCP通信实例代码。

    workerman PHP socket 服务器框架

    workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP... workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。

    workerman-chat-for-winPHP socket 服务器框架

    workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP... workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。

    RPC研究,从浅到深,含研究笔记:超级全面,包懂

    RPC研究,从浅到深,含研究笔记:超级全面,包懂。代码分等级,从最简单的socket通信,到通过代理获取;再到动态代理;代理接口不暴露;以及序列化方式对比;以及大数据框架下的rpc通信应用。自己整理了很久,超值!

    一个PHP开发的的高性能Socket服务器框架.rar

    被广泛的用于手机app、手游服务端、网络游戏服务器、聊天室服务器、...workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。

    amf_socket:Actionscript (Flash) 的双向 RPC 库。 高性能网络通信的简易按钮!

    使用这个库,您可以轻松地将事件驱动的网络功能添加到您的 Flash 应用程序中,而无需处理低级细节。 高性能和低延迟是通过使用持久性 TCP/IP 套接字和 Flash 的本机序列化格式 (AMF) 实现的。 由于使用 AMF,您可以...

    Delphi网络通信协议分析与应用实现pdf清晰

    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信息包 ...

    nz-rpc:基于netty和zookeeper的RPC框架

    基于netty和zookeeper的RPC框架说明nzRpc是一个基于netty和zookeeper的RPC框架,使用netty作为底层socket通信框架。使用Zookeeper作为注册中心。服务提供者启动时会向服务注册中心注册相关信息消费者启动时,会获取...

    Hprose 全名是高性能远程对象服务引擎.rar

    目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。 2. 从通信协议的层面 基于 HTTP 协议的(例如基于...

    PHP实现创建一个RPC服务操作示例

    主要应用于不同的系统之间的远程通信和相互调用。 比如有两个系统,一个是PHP写的,一个是JAVA写的,而PHP想要调用JAVA中的某个类的某个方法,这时候就需要用到RPC了。 怎么调?直接调是不可能,只能是PHP通过某种...

    网络编程教程,很好的一本写linux网络编程书,这是我上传的源码

     12.3.2 Rpcgen构建RPC应用  12.3.3 编写RPC说明文件  12.3.4 修改客户端程序  12.3.5 修改服务器端程序  12.3.6 调用的完整过程  12.3.7 程序的结果、分析和总结  本章小结 第四篇 高级...

    了解java远程通讯技术的最好的文章

    了解java远程通讯技术的最好的文章, ...传输协议比较出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式

    PHP应用开发框架yaf-lib.zip

    yaf-lib 基于 yaf 的应用开发框架, 简单的mvc中间层继承补充, 常用缓存、数据库等驱动类, 添加widget组件模块,及layout插件, rpc服务化,支持hprose、yar等, 支持xhprof性能调试。requirementphp 5.3 ...

    精通并发与netty视频教程(2018)视频教程

    31_gRPC在Nodejs领域中的静态代码生成及与Java之间的RPC通信 32_IO体系架构系统回顾与装饰模式的具体应用 33_Java NIO深入详解与体系分析 34_Buffer中各重要状态属性的含义与关系图解 35_Java NIO核心类源码解读与...

    精通并发与 netty 视频教程(2018)视频教程

    28_gRPC与Gradle流畅整合及问题解决的完整过程与思考 29_Gradle插件问题解决方案与Nodejs环境搭建 30_通过gRPC实现Java与Nodejs异构平台的RPC调用 31_gRPC在Nodejs领域中的静态代码生成及与Java之间的RPC通信 ...

    acl C++跨平台库.rar

    此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、ICMP、redis、disque、memcache、beanstalk、handler socket),常见流式编解码库:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 等。 ### 2、acl 库...

    Java RMI在分布计算中的应用 (2005年)

    随着网络技术、面向对象技术(OOT)的成熟,分布计算技术不再是实验室里的高新技术,分布计算...首先阐述分布计算机系统的概念,并分析在分布计算中,Socket通信协议和RPC的不足,然后论述如何使用Java RMI实现分布计算.

    neucluster:多协议服务器构建器和流程管理器平台

    用于内部微服务通信的rpc服务器(websocket jsonrpc2.0) rpc客户端 WebSocket服务器生成器 HTTP / 2 自定义服务器生成器-例如,已实现Socket.IO 序列化ORM tmpfs(Ram基础)配置存储,通过neuconf工具更改运行...

    精通并发与netty 无加密视频

    第31讲:gRPC在Nodejs领域中的静态代码生成及与Java之间的RPC调用 第32讲:IO体系架构系统回顾与装饰模式的具体应用 第33讲:Java NIO深入详解与体系分析 第34讲:Buffer中各重要状态属性的含义与关系图解 第35...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics