`

基于TCP协议实现RPC

    博客分类:
  • java
阅读更多
RPC的全称:Remote Process Call,即远程过程调用,拥有RMI、webService等诸多成熟方案。
如图:

实现代码如下:
User代码:
package com.test.xulihua;

import java.io.Serializable;

/**
 * Created with IntelliJ IDEA.
 * User:
 * Date: 2018/3/19
 * Time: 11:16
 * To change this template use File | Settings | File Templates.
 */
public class User implements Serializable{
    private String name;
    private int age;
    private boolean sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isSex() {
        return sex;
    }

    public void setSex(boolean sex) {
        this.sex = sex;
    }
}


consumer.java代码
package com.test.xulihua;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.Socket;

/**
 * Created with IntelliJ IDEA.
 * User: 
 * Date: 2018/3/19
 * Time: 10:40
 * To change this template use File | Settings | File Templates.
 */
public class Consume {
    public static void main(String[] args) throws IOException, NoSuchMethodException, ClassNotFoundException {
        Socket socket = new Socket("127.0.0.1",8888);
        ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
        String interfaceName = HelloSayService.class.getName();
        Method method = HelloSayService.class.getMethod("helloSay",User.class);
        User user =new User();
        user.setName("王五");
        Object[] params = {user};
        outputStream.writeUTF(interfaceName);    //接口名称
        outputStream.writeUTF(method.getName());  //方法名称
        outputStream.writeObject(method.getParameterTypes());
        outputStream.writeObject(params);
        ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
        User object = (User) inputStream.readObject();
        System.out.println(object.getName()+":"+object.getAge()+":");
    }
}

Provider代码:
package com.test.xulihua;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * User: 
 * Date: 2018/3/19
 * Time: 10:38
 * To change this template use File | Settings | File Templates.
 */
public class ServerProvide {
    private static Map<String,Object> services= new HashMap<String, Object>();
    static{
        services.put(HelloSayService.class.getName(),new HelloSayServiceImpl());
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InterruptedException {
        ServerSocket serverSocket = new ServerSocket(8888);
        while (true){
            Thread.sleep(1000L);
            Socket socket = serverSocket.accept();
            ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
            String interfaceName = inputStream.readUTF();
            String methodName = inputStream.readUTF();
            Class<?>[] paramterType = (Class<?>[]) inputStream.readObject();
            Object[] paramter = (Object[]) inputStream.readObject();
            Class serviceClass = Class.forName(interfaceName);
            Object service =   services.get(interfaceName);
            Method method = serviceClass.getMethod(methodName,paramterType);
            Object result = method.invoke(service,paramter);
            ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
            outputStream.writeObject(result);

        }
    }
}


接口HelloSayService.java
package com.test.xulihua;

/**
 * Created with IntelliJ IDEA.
 * User: 
 * Date: 2018/3/19
 * Time: 10:35
 * To change this template use File | Settings | File Templates.
 */
public interface HelloSayService {

    public User helloSay(User user);
}


接口service实现代码:
package com.test.xulihua;

/**
 * Created with IntelliJ IDEA.
 * User: 
 * Date: 2018/3/19
 * Time: 10:37
 * To change this template use File | Settings | File Templates.
 */
public class HelloSayServiceImpl implements HelloSayService {
    public User helloSay(User user) {
        user.setAge(123);
        user.setSex(false);
        return user ;
    }
}

  • 大小: 35.9 KB
分享到:
评论

相关推荐

    基于TCP协议的二进制RPC通信协议的Java实现源码+项目说明.zip

    基于TCP协议的二进制RPC通信协议的Java实现源码+项目说明.zip 一种基于TCP协议的二进制高性能RPC通信协议实现。它以Protobuf作为基本的数据交换格式,支持完全基于POJO的发布方式,极大的简化了开发复杂性 - 完全...

    Protobuf RPC是一种基于TCP协议的二进制RPC通信协议的Java实现.zip

    总结,Protobuf RPC是一种高效的RPC通信方式,它利用protobuf进行数据序列化,基于TCP协议保证传输的可靠性。在Java中实现Protobuf RPC涉及服务接口定义、客户端和服务端的实现、TCP连接管理等多个方面,适合于对...

    基于TCP协议的WCF调用简单程序

    总的来说,基于TCP协议的WCF调用简单程序涵盖了服务开发的基本流程,从服务端的设计、实现到客户端的调用,都是学习和掌握WCF技术的关键步骤。这种通信方式在企业级应用中非常常见,尤其是在需要高性能、高可靠性的...

    大型分布式网站架构设计与实践.带目录书签.完整版.rar

    《大型分布式网站架构设计与实践》主要介绍了大型...第1章主要介绍企业内部SOA(Service Oriented Architecture,即面向服务的体系结构)架构的实现,包括HTTP协议的工作原理,基于TCP协议和基于HTTP协议的RPC实现,如

    基于socket实现的rpc调用demo

    在这个基于Socket的RPC实现中,`socketServer`扮演服务端的角色,它监听客户端的请求并处理这些请求;而`socketClient`则是客户端,它负责发送请求到服务器,并接收返回的结果。 1. **SocketServer的实现**: - ...

    rpc远程调用库C语言实现

    - **网络通信模块**:实现了基于TCP或HTTP的网络通信接口,用于发送和接收RPC请求。 - **示例代码**:提供了使用该库的示例,帮助开发者理解和使用库中的功能。 - **配置和构建文件**:包含了编译和链接库所需的...

    Jprotobuf-rpc-socket:Protobuf RPC是一种基于TCP协议的二进制RPC通信协议的Java实现

    Protobuf RPC是一种基于TCP协议的二进制高性能RPC通信协议实现。它以Protobuf作为基本的数据交换格式,支持完全基于POJO的发布方式,极大的简化了开发复杂性。 Features: 完全支持POJO方式发布,使用非常简单 内置...

    基于Netty框架的RPC服务.zip

    本项目是一个基于Netty框架实现的RPC(远程过程调用)服务。Netty是一个高性能、异步事件驱动的网络应用框架,适用于快速开发可维护的高性能协议服务器和客户端。本项目利用Netty的强大功能,实现了RPC服务的客户端...

    RPC_Framework:基于TCP协议的远程过程调用框架客户端实现

    #####基于TCP协议的远程过程调用框架——客户端,服务端基于TCP协议实现的一套RFC(远程过程调用)框架。 客户端和服务端均分为业务层,协议层(JSON),网络层(libevent),可以根据自己的业务定制每一层的接口; ...

    基于php扩展swoole封装的一个简易的JSON协议的RPC框架

    本项目则是在Swoole的基础上,构建了一个基于JSON协议的远程过程调用(RPC)框架。通过此框架,开发者可以轻松地实现服务间的通信,提高系统的可扩展性和解耦性。 【描述】 这个简易的JSON-RPC框架是作者自己的实践...

    xrpc:基于TCP的RPC框架

    xrpc基于TCP的RPC框架RPC框架包含几大部分一,通讯1,协议:TCP和HTTP2的优劣TCP包较小,有更好的传输速率,但易用性没有HTTP2好HTTP2虽然会稍微占一些流量,但由于其具有一些重叠,头部压缩等新特性,速度应该并不...

    基于socket的rpc

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

    基于springboot的rpc服务

    SpringBoot以其简洁、快速的特性,成为了现代Java开发中的首选框架,它使得构建基于RPC的服务变得非常简单。本教程将深入探讨如何在SpringBoot中实现RPC服务。 首先,理解RPC的基本概念是必要的。RPC允许服务提供者...

    RPC-使用python代码基于gevent实现。

    根据rpc协议的思想,使用python的协程gevent实现的一个基于tcp,只能python使用的rpc协议, 不能夸语言, 不过不需要写额外的比如protobuf协议。 通过把类实例化后put到一个自定义对象中,实现方法的注册。 客户端...

    Mina实现RPC的例子

    Apache Mina是一个开源项目,它提供了一个高度可扩展且高性能的网络通信框架,支持多种协议,如TCP、UDP等。 首先,理解Mina的核心概念是必要的。Mina基于事件驱动和异步模型,允许开发者创建高效的网络应用。其...

    java实现rpc框架

    例如,可以使用HTTP/1.1或HTTP/2,结合RESTful API设计原则,实现基于HTTP的RPC通信。Java的HttpURLConnection类和HttpClient库(如Apache HttpClient)可以方便地处理HTTP请求和响应。 综上所述,构建一个Java实现...

    rpc原理的简单实现

    这里给出一个简单的RPC实现示例,使用Python的socket库: ```python # 服务器端 import socket def remote_service(data): return "Service result: " + data s = socket.socket(socket.AF_INET, socket.SOCK_...

    tocol:提供TCP复用的RPC调用

    TCP连接使用策略是基于TCP连接最近使用时间来判断的 关于Protocol 目前实现的协议有java自带的二进制协议和hessian协议 协议是可扩展的 关于传输协议 该框架使用自定义协议,头四个字节表示数总长度,第五个字节表示...

    《netty实战》http协议、自定义协议、自定义RPC模块学习源码.zip

    自定义协议是指根据特定需求设计的通信协议,它可能基于TCP、UDP或者其他传输层协议。在Netty中,你可以通过定义ByteToMessageDecoder和MessageToByteEncoder等编解码器来处理自定义协议的数据帧。这些编解码器允许...

Global site tag (gtag.js) - Google Analytics