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;}



原创粉丝点击