package com.rpc;

public interface EchoService {
String echo(String ping); }
package com.rpc;

public class EchoServiceImpl implements EchoService{

    @Override
public String echo(String ping) {
// TODO Auto-generated method stub
return ping != null ? ping + "--> I am ok.":"I am ok.";
} }
package com.rpc;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
* 服务生产者
* @author Administrator
*
*/
public class RpcExporter {
static Executor executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
public static void exporter(String hostname,int port) throws Exception{
ServerSocket server = new ServerSocket();
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;
}
@Override
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());
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) {
e.printStackTrace();
}
if(client != null)
try{
client.close();
}catch(IOException e){
e.printStackTrace();
}
}
} }
}
package com.rpc;

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.InetSocketAddress;
import java.net.Socket;
/**
* 服务消费者
* @author Administrator
*
* @param <S>
*/
public class RpcImporter<S> {
// serviceClass 即传入的具体实现类
@SuppressWarnings("unchecked")
public S importer(final Class<?> serviceClass, final InetSocketAddress addr) {
return (S) Proxy.newProxyInstance(serviceClass.getClassLoader(), serviceClass.getInterfaces(),
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());
output.writeUTF(serviceClass.getName());
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();
} }
});
}
}
package com.rpc;

import java.net.InetSocketAddress;

public class RpcTest {
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() { @Override
public void run() {
try {
RpcExporter.exporter("localhost", 8080);
} catch (Exception e) {
e.printStackTrace();
} }
}).start();
RpcImporter<EchoService> importer = new RpcImporter<EchoService>();
EchoService echo = importer.importer(EchoServiceImpl.class, new InetSocketAddress("localhost", 8080));
System.out.println(echo.echo("Are you ok ?"));
}
}

最新文章

  1. USACO翻译:USACO 2013 NOV Silver三题
  2. bzoj4462: [Jsoi2013]编程作业
  3. 记录遇到的Python陷阱和注意点
  4. 6-Highcharts曲线图之带标识
  5. HttpContext详解【转】
  6. Sass与Compress实战:第七章
  7. android 后台服务定时通知
  8. Java入门篇(二)——Java语言基础(上)
  9. 第一个Polymer应用 - (1)创建APP结构
  10. Django的项目创建,以及该端口号,语言随地区而变化
  11. ORACLE创建数据库时无法创建目录
  12. JQuery-学习。
  13. Unity全面优化
  14. 用sp_lock诊断SQL Sever的死锁问题
  15. hadoop hdfs设置quota
  16. 小程序 image跟view标签上下会有空隙
  17. 如何上传网站程序(文件浏览器上传网页、FileZilla上传网站程序)
  18. 34、Django实战第34天:退出登录
  19. 传统路径导出 VS 直接路径导出(oracle exp direct=y)
  20. 剑指offer25 二叉树中和为某一直的路径

热门文章

  1. PyQt样式设计
  2. 小程序开发全栈1.2/3/4组件、flex布局、样式
  3. 关于ajaxSubmit传递参数 后台接收为&quot;参数,参数”的问题
  4. 【laravel】Eloquent 模型事件和监听方式
  5. CentOS6下yum搭建LNMP环境
  6. 第一部分_Mac技巧
  7. PHP is_dir() 函数
  8. PHP xml_set_notation_decl_handler() 函数
  9. ZR 提高十连 DAY 4
  10. Oracle连接池工具类OJDBCUtils