rpc 简单模型
来源:互联网 发布:阿里云主机多少钱 编辑:程序博客网 时间:2024/06/01 09:49
package com.self.socket.cli;import java.lang.reflect.Method;public class ClientTask { private String clz; private Method method; private Object[] args; private Object object; public synchronized void setResult(Object obj){ this.object=obj; this.notify(); } public synchronized Object getObject() { if(object==null){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } return object; } public ClientTask(String clz, Method method, Object[] args) { this.clz = clz; this.method = method; this.args = args; } public String getClz() { return clz; } public Method getMethod() { return method; } public Object[] getArgs() { return args; }}
package com.self.socket.cli;import com.ali.service.Learn;import com.self.socket.system.Common;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class SocketCli { public static void main(String[] args) { SocketWork.work(Common.client_do); Learn learn= SocketWork.refer(Learn.class); ExecutorService executorService= Executors.newCachedThreadPool(); for(int i=0;i<1000;i++){ executorService.execute(new Runnable() { @Override public void run() { //System.out.println(learn.get()); learn.time(System.currentTimeMillis()); } }); } }}
package com.self.socket.cli;import com.self.socket.system.Common;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.net.Socket;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;public class SocketWork { public static LinkedBlockingQueue<ClientTask> queue=new LinkedBlockingQueue(); public static <T> T refer(final Class<T> referClass){ InvocationHandler invocationHandler= new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String key=referClass.getCanonicalName(); ClientTask task=new ClientTask(key,method,args); SocketWork.queue.put(task); return task.getObject(); } }; return (T) Proxy.newProxyInstance(referClass.getClassLoader(), new Class[]{referClass},invocationHandler); } public static void work(int num){ ExecutorService executorService= Executors.newCachedThreadPool(); for(int i=0;i<num;i++){ executorService.execute(new Runnable() { @Override public void run() { try { Socket socket=new Socket(Common.ip,Common.port); OutputStream outputStream = socket.getOutputStream(); ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream); ObjectInputStream objectInputStream=new ObjectInputStream(socket.getInputStream()); for (;;){ ClientTask task=queue.take(); objectOutputStream.writeUTF(task.getClz()); objectOutputStream.writeUTF(task.getMethod().getName()); objectOutputStream.writeObject(task.getMethod().getParameterTypes()); objectOutputStream.writeObject(task.getArgs()); objectOutputStream.flush(); Object object=objectInputStream.readObject(); task.setResult(object); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }); } }}
package com.self.socket.server;import com.self.socket.system.Common;import com.self.socket.system.Cache;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.*;public class RegisterSocket { //存放socket任务 static LinkedBlockingQueue queue=new LinkedBlockingQueue(); public static void main(String[] args) { ServerSocket serverSocket= null; try { serverSocket = new ServerSocket(Common.port); work(); for(;;){ Socket socket=serverSocket.accept(); System.out.println("一个新客户端进来了!"); ServerWork serverWork =new ServerWork(socket); Cache.cacheSocket.put(serverWork.hashCode(), serverWork); } } catch (IOException e) { e.printStackTrace(); }finally { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } private static void work(){ //检测是否有socket传递数据过来 new Thread(new Runnable() { public void run() { for (;;) { for (ServerWork serverWork: Cache.cacheSocket.values()) { if(serverWork.isAvailable()){ try { System.out.println("name:"+serverWork.hashCode()); queue.put(serverWork); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }).start(); //处理socket数据 ExecutorService executorService= Executors.newFixedThreadPool(Common.server_do); for (int i=0;i<Common.server_do;i++){ executorService.execute(new Runnable() { @Override public void run() { try { for(;;){ ServerWork serverWork = (ServerWork)queue.take(); serverWork.doGet(); } } catch (InterruptedException e) { e.printStackTrace(); } } }); } }}
package com.self.socket.server;import com.self.socket.system.Cache;import java.io.*;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.net.Socket;import java.util.Random;public class ServerWork{ private Socket socket; private InputStream inputStream; private volatile boolean isRead=true; private ObjectInputStream objectInputStream; private ObjectOutputStream objectOutputStream; public ServerWork(Socket socket) { this.socket=socket; init(); } private void init(){ try { inputStream=socket.getInputStream(); objectInputStream=new ObjectInputStream(inputStream); objectOutputStream=new ObjectOutputStream(socket.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } } public synchronized boolean isAvailable(){ try { if(inputStream.available()>0&&isRead){ isRead=false; return true; } return false; } catch (IOException e) { e.printStackTrace(); close(); Cache.cacheSocket.remove(this.hashCode()); return false; } } public void doGet() { System.out.println(Thread.currentThread().getName()+" server is running"); try { try { String clz= objectInputStream.readUTF()+"Impl"; String methodName=objectInputStream.readUTF(); Class<?>[] classes= (Class<?>[]) objectInputStream.readObject(); Object[] args= (Object[]) objectInputStream.readObject(); Method method=Class.forName(clz).getMethod(methodName,classes); Object obj=method.invoke(Class.forName(clz).newInstance(),args); objectOutputStream.writeObject(obj); objectOutputStream.flush(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); }finally { isRead=true; } } catch (IOException e) { e.printStackTrace(); close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public void close(){ try { inputStream.close(); objectInputStream.close(); objectOutputStream.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } }}
package com.self.socket.system;import com.self.socket.server.ServerWork;import java.util.concurrent.ConcurrentHashMap;public class Cache { //存放服务端 socket 一直遍历循环 检测是否有数据过来 public static ConcurrentHashMap<Integer,ServerWork> cacheSocket=new ConcurrentHashMap<Integer, ServerWork>();}
package com.self.socket.system;public interface Common { String ip="localhost"; int port =10086; //服务端处理数据 线程、 int server_do=10; //服务端线程数量 int client_do=10;}
阅读全文
0 0
- rpc 简单模型
- 用AKKA实现简单的RPC通信模型2
- **通信-RPC模型**
- 分布式Web应用----基于Socket+动态代理实现简单RPC 生产者消费者模型
- 简单webservice rpc 客户端
- RPC简单使用
- rpc的简单介绍
- RPC-Thrift简单应用
- 简单的RPC实现
- rpc 简单原理
- 简单实现的RPC
- RPC架构简单理解
- RPC过程简单实现
- go rpc 简单用法
- rpc 简单实现
- RPC简单介绍
- RPC框架简单原理
- RPC 简单介绍
- 11g搭建DataGuard的步骤
- 世界互联网大会,马云、马化腾、库克、李彦宏都说了一件事
- Android系统移植与调试之安装apk时MTK命令和出现Failure [INSTALL_FAILED_DEXOPT]问题解决方法
- ideal激活
- 解决bootstrap中大于1200px的显示问题
- rpc 简单模型
- memcached真实项目中的应用
- mysql 中常用的语句
- 内存加载图片压缩 BitmapFactory.Options
- 【特征检测】BRIEF特征点描述算法
- 被上班势力吓哭~来点提神的吧!
- R使用小技巧
- oracle dbf文件更换目录
- Leetcode Num.169 -- Majority Element