`

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 ?"));
    }
}
分享到:
评论

相关推荐

    基于socket实现的rpc调用demo

    RPC(Remote Procedure Call)是一种进程间通信技术,它允许程序在不同的网络环境下调用另一台计算机上的函数或方法,就像是直接调用本地函数一样简单。本示例是基于Socket实现的RPC调用Demo,让我们深入探讨一下这...

    基于socket的rpc

    在本文中,我们将探讨基于Socket的RPC实现以及后续的改进计划,包括升级到Netty作为底层通信库,以及引入Zookeeper作为注册中心。 首先,让我们深入了解基于Socket的RPC工作原理。在客户端,我们定义了一个接口,...

    分布式系统中的通信方式:RPC与RMI.pdf

    在实际应用中,RPC和RMI已被广泛应用于各种分布式系统和服务架构中,它们在云计算、微服务架构、大型网站后端服务等众多领域都有着举足轻重的地位。 总之,分布式系统的成功构建离不开高效的通信机制。RPC和RMI通过...

    Java rpc框架简易版,类似dubbo分布式实现 (纯socket实现).zip

    本项目提供了一个简易版的Java RPC框架实现,旨在模仿著名的Dubbo框架,但采用了更基础的Socket通信方式进行分布式服务的搭建。以下是这个项目的核心知识点: 1. **RPC原理**:RPC使得客户端可以像调用本地方法一样...

    实现一个简单的RPC框架

    5. **安全性考虑**:在实际应用中,还需要考虑RPC的安全性,例如,添加身份验证、授权、加密等安全措施。 以上就是使用socket、反射和序列化技术实现简单RPC框架的主要过程。这个框架虽然基础,但已经能够展示RPC的...

    rpc原理的简单实现

    RPC(Remote Procedure Call)远程过程调用是一种计算机通信协议,它允许程序在一台计算机上执行一个功能,并且看起来像在本地执行一样...理解RPC的工作原理和Socket通信,对于开发分布式应用和理解网络编程至关重要。

    C语言利用socket套接字实现客户端和服务器端TCP通信实例

    在IT领域,网络通信是计算机科学的一个重要组成部分,特别是在分布式系统和互联网应用中。C语言作为底层编程的强大工具,常用于实现低级别的网络操作,如socket编程。本篇将详细探讨如何利用C语言的socket套接字实现...

    RPC通信模型(java)

    在Java中实现RPC通信模型,通常涉及客户端、服务端、序列化和网络通信等多个环节。以下是对这个主题的详细阐述: 1. **RPC基本原理**: RPC使得客户端可以像调用本地方法一样调用远程服务器上的方法,隐藏了网络...

    Socket 之 BIO、NIO、Netty 简单实现

    在Socket通信中,RPC可以借助于序列化和反序列化机制将方法调用和参数转换成可传输的数据,通过Socket发送到远程服务器,服务器解析数据后执行相应操作,并将结果回传给客户端。Netty由于其高效的I/O处理能力,常被...

    Loadrunner基于socket编程

    - 在LoadRunner中,我们可以选择“Web Custom Protocol”或者“RPC”协议来实现Socket通信。RPC协议通常用于处理远程过程调用,而自定义协议则可以创建更复杂的通信模型。 - 使用Vuser脚本编写Socket通信时,...

    极简、易用、高性能的AIO通信框架,人人都能轻松应对百万级长连接场景 5G时代的通信微内核,适用于IM、RPC、IoT等诸多领域

    在IM应用中,它可以确保消息的实时传递;在RPC场景中,它能保证服务间的快速调用;在IoT领域,它能有效地连接和管理海量设备。 五、广泛的应用场景 1. IM(即时通讯):Smart Socket的高性能和低延迟特性使其成为...

    使用netty自定义rpc通信框架

    - `rpc_web_test`:可能是一个测试示例,展示如何在Web应用中集成和使用这个RPC框架。 - `rpc_jar_test`:可能是一个独立的JAR测试项目,用于验证RPC框架的功能和性能。 综上所述,"使用netty自定义rpc通信框架...

    java自制简单RPC调用例子

    RPC(Remote Procedure Call)是一种分布式计算技术,允许在一台...通过学习这个简单的RPC调用例子,你可以理解RPC的基本原理,掌握如何在Java中实现客户端和服务端的通信,为后续深入研究复杂的分布式系统打下基础。

    rpc的简单实现.docx

    在实际应用中,通常会使用更复杂的配置管理系统,如Spring Cloud Config。 8. **服务导出方式:** - 服务提供者可以有多种服务导出方式,例如通过HTTP、TCP或基于消息队列的方式。选择哪种方式取决于系统需求,如...

    C++ Rpc远程计算

    8. **安全考虑**:在实际应用中,RPC通信可能需要考虑安全性,比如数据加密(SSL/TLS)、身份验证和授权等。这通常需要结合网络安全库如OpenSSL来实现。 9. **性能优化**:为了提高RPC的性能,可以考虑缓存策略、...

    Java RPC调用示例

    在实际应用中,Java有多个成熟的RPC框架,如Apache Dubbo、Hessian、gRPC等。这些框架已经封装了上述过程,提供更加便捷、高效的RPC解决方案。 总结一下,Java RPC调用涉及服务接口定义、数据序列化、网络通信、...

    手写RPC底层实现原理

    三、Socket通信 Socket是网络通信的基础,它是应用程序与网络协议栈交互的接口。在RPC中,Socket用于在客户端和服务器之间建立连接并传输数据。TCP Socket提供可靠的、面向连接的通信,而UDP Socket则提供无连接、不...

    一个模块化的RPC服务器建立在Kohana.zip

    总的来说,这个"一个模块化的RPC服务器建立在Kohana.zip"项目旨在利用Kohana的模块化和灵活性,创建一个能够通过Socket通信的RPC服务器。开发者可能已经实现了RPC请求的解析、服务调用和响应构造的逻辑,并将其与...

    rpc-demo.zip

    在这个“rpc-demo.zip”压缩包中,你将找到一个简单的RPC实现,它是基于Spring框架和服务的动态发布,同时使用了底层的Socket通信。下面我们将深入探讨这个实例中的关键知识点。 首先,RPC的核心思想是透明性,即...

    rpc远程调用库C语言实现

    在实际应用中,开发人员可以根据自己的需求,通过`jsonrpc-c`库创建客户端和服务端程序,实现基于JSON的RPC通信。例如,客户端可以使用库提供的函数生成JSON请求,然后通过网络接口发送到服务器;服务器端则监听特定...

Global site tag (gtag.js) - Google Analytics