实现自己的大发888平台开发框架(采用Java Socket)

大发888平台开发实现原理图:

1、Service API对应服务接口。

HelloService.java代码如下:

package com.shan.rpc.service;

public interface HelloService {
    public String sayHello(String content);
}

2、Service Impl对应服务接口的实现:

HelloServiceImpl.java代码如下:

package com.shan.rpc.service.impl;

import com.shan.rpc.service.HelloService;

public class HelloServiceImpl implements HelloService {
    public String sayHello(String content) {
        return "hello," + content;
    }
}

3、Consumer Proxy 角色对应服务消费者代理类。通过实现服务接口的动态代理对象获得服务接口的动态代理实例Proxy.newProxyInstance,通过实现InvocationHandler接口中的invoke方法来完成远程RPC的调用。具体通过输出流将调用接口的方法及参数写入Socket,发起远程调用。之后通过Java对象输入流从Socket获得返回结果。

ConsumerProxy.java代码如下:

package com.shan.rpc.framework;

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

public class ConsumerProxy {

    /**
     * @Title: consume
     * @Description:服务消费代理
     * @author fuss
     * @date 2018年7月12日
     * @param interfaceClass
     * @param host
     * @param port
     * @return
     * @throws Exception
     */
    public static <T> T consume(final Class<T> interfaceClass, final String host, final int port) throws Exception {
        return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class<?>[]{interfaceClass}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Socket socket = new Socket(host, port);
                try {
                    ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
                    try {
                        output.writeUTF(method.getName());
                        output.writeObject(args);
                        ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
                        try {
                            Object result = input.readObject();
                            if (result instanceof Throwable) {
                                throw (Throwable) result;
                            }
                            return result;
                        } finally {
                            input.close();
                        }
                    } finally {
                        output.close();
                    }
                } finally {
                    socket.close();
                }
            }
        });
    }

}

4、Provider Reflect角色对应服务发布实现。通过输入流从Socket中按照ConsumerProxy的写入顺序注意获取调动方法

名称及方法参数,通过MethodUtils.invokeExactMethod对服务实现类发起反射调用,将调用结果写入Socket返回给对方。

ProviderReflect.java代码如下:

package com.shan.rpc.framework;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.commons.lang3.reflect.MethodUtils;

public class ProviderReflect {

    private static final ExecutorService EXECUTOR_SERVICE = Executors.newCachedThreadPool();

    /**
     * @Title: provider
     * @Description:服务发布
     * @author fuss
     * @date 2018年7月12日
     * @param service
     * @param port
     * @throws Exception
     */
    public static void provider(final Object service, int port) throws Exception {
        ServerSocket serverSocket = new ServerSocket(port);
        while (true) {
            final Socket socket = serverSocket.accept();
            EXECUTOR_SERVICE.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
                        try {
                            try {
                                String methodName = input.readUTF();//方法名称
                                Object[] args = (Object[]) input.readObject();//方法参数
                                ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
                                try {
                                    Object result = MethodUtils.invokeExactMethod(service, methodName, args);
                                    output.writeObject(result);
                                } catch (Throwable t) {
                                    output.writeObject(t);
                                } finally {
                                    output.close();
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            } finally {
                                input.close();
                            }
                        } finally {
                            socket.close();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
            });
        }
    }

}

然后写main方法通过ProviderReflect发布服务,代码如下:

package com.shan.rpc.invoke;

import com.shan.rpc.framework.ProviderReflect;
import com.shan.rpc.service.HelloService;
import com.shan.rpc.service.impl.HelloServiceImpl;

public class RpcProviderMain {

    public static void main(String[] args) throws Exception {
        HelloService service = new HelloServiceImpl();
        ProviderReflect.provider(service, 8083);
    }

}

客户端调用远程服务的main方法,代码如下:

package com.shan.rpc.invoke;

import com.shan.rpc.framework.ConsumerProxy;
import com.shan.rpc.service.HelloService;

public class RpcConsumerMain {

    public static void main(String[] args) throws Exception {
        HelloService service = ConsumerProxy.consume(HelloService.class, "127.0.0.1", 8083);
        for (int i = 0; i < 1000; i++) {
            String hello = service.sayHello("fuss_" + i);
            System.out.println(hello);
            Thread.sleep(1000);
        }
    }

}

执行结果如图:

原文地址:http://blog.51cto.com/13883597/2149033

时间: 2024-11-09 03:31:35

实现自己的大发888平台开发框架(采用Java Socket)的相关文章

pandas数据大发888平台出租规整化:清理、转换、合并、重塑

数据分析和大发888平台出租haozbbs.comQ1446595067建模方面的大量编程工作都是用在数据准备上的:加载.清理.转换以及重塑.许多人选择使用通用编程语言或unix文本处理工具(如sed或awk)对数据格式进行专门处理. 幸运的是,pandas和python标准库提供了一组高级的.灵活的.高效的核心函数和算法,将数据规整化正确的形式. 合并数据集: pandas对象中的数据可以通过一些内置的方式进行合并:(1)pandas.merge可根据一个名多个键将不同DataFrame中的行

Jeewx捷微 , 免费微信公众账号管家系统发布,采用JAVA语言

JeeWx, 微信管家平台,简称"捷微". 捷微是一款免费开源的JAVA微信公众账号开发平台. 当前最新版本: 2.3(发布日期:20160323) 一.捷微Jeewx简介 Jeewx是一个开源.高效.敏捷的微信开发平台,采用JAVA语言基于Jeecg快速开发框架实现,实现了微信平台的基础功能,便于用户二次开发,支持微信第三方平台全网发布.支持微信插件开发机制,可轻松集成微信H5插件. 二.主要特性 基于快速开发平台jeecg 3.4.4版本,采用SpringMVC+Hibernate

企业信息化解决方案——插件式平台开发框架

0.三板斧 作为职业Programmer或是优秀Team,拥有一套成熟.稳定的开发框架,无疑是行走IT江湖.纵横IT市场的必备功底. 无图无真相,作为一个讲究实效的ITer,先来几道的甜点凉菜,后续会上更多的硬菜啦~o(∩_∩)o ~ 0.1 平台登录界面 0.1.平台登录界面 平台登录模块的设计兼顾了安全性和易用性.只有合法授权且状态正常的用户才能登录到平台.同时为方便用户使用,在确保电脑使用者相对唯一的情况下,可以选择保存登录信息,系统会自动对用户的相关登录信息采取加密手段后进行存储. 0.

开源免费的微信公众平台开发框架

CakeWX,开源免费好用的微信公众平台开发框架功能特色:1. 基于CakePHP,开源免费.2. 小巧精致,可下载源码,搭建属于自己的微信平台.3. 简单好用的关键字,自动回复,图文,活动,自定义菜单等基础功能.4. 根据需求进行二次开发,或者提交给社区.下载地址:http://cakewx.com在线演示:http://www.zaiwx.com (注册账号即可测试)安装环境:CakeWX 是基于PHP和MySQL技术开发,可同时使用于Windows.Linux平台,环境需求如下:1.Win

Jeewx 是一款开源、免费的微信管家系统(多触点管理平台)。采用 JAVA 语言

Jeewx 是一款开源.免费的微信管家系统(多触点管理平台).采用 JAVA 语言,支持微信公众号.微信企业号.支付宝服务窗.QQ 公众号.微博账号等多触点管理.Jeewx 实现了微信.支付窗.微信企业号.微博等触点的基础管理功能,便于用户二次开发. 2014年荣获CSDN开发商大会第一名.采用JAVA语言,支持微信公众号.微信企业号.支付宝服务窗等多触点管理.Jeewx实现了微信公众号.支付窗.微信企业号等触点的基础管理功能,便于用户二次开发. http://git.oschina.net/j

微信公众平台开发框架推荐

非常强大的微信公众平台开发框架推荐中有官方和第三方开发者提供的丰富的插件,是免费并且成熟的框架,更多的信息可以点击这里: 微擎:http://www.we7.cc/ 微笑:http://www.sylai.com/ weiphp:http://www.weiphp.cn/

大发彩票平台出租搭建

大发彩票平台出租搭建1148916888.com 带手机版.源码开源. 根据实体对象的属性获取相关对象时,在虚拟机中,获取的仍然可能是一个托管对象引用,如根据虚拟机的属性runtime获取到的VirtualMachineRuntimeInfo对象,要获取该对象中的主机名,通过getHost()方法获取的是host的一个ManagedObjectReference,这样就需要进一步根据托管对象获取其对应的实体名称. 代码如下: /** @Title: getObjectName @Descript

正版大发彩票平台压缩和归档操作(16个命令)

正版大发彩票平台 下载地址 QQ2952777280程序源码参数说明:运行环境:php5.2+mysql源码类别:(彩票)现金网系统界面语言:简体中文源码授权:无加密文件及认证授权,永久性可直接使用.版本支持:PC/WAP网页版编程语言:PHP正版大发彩票平台游戏:29种游戏(20个官方彩,9个系统彩)手机版独家对接的,完整无错! 此源码经过测试人员实测截图,保证100%和截图一致!!! 1.gzip [命令作用] 用来压缩文件(后缀为.gz) [命令语法] gzip(选项)(参数) [常用选项

通过scaleType裁剪大发888源码下载缩放图片适配不同屏幕不同

后特意大发888源码下载论坛:haozbbs.com Q1446595067设置一个ImageView宽高均为600pix.观察不同scaleType配置下,Android对原图的裁剪缩放效果.左侧为代码,右侧为缩放和裁剪效果.(1)android:scaleType="fitXY" 可见是铺面整个ImageView进行拉伸缩放.不对原图进行裁剪,仅仅缩放. (2)android:scaleType="center" 这种情况下,要对原图裁剪,以图片中心为基准,以中