反射,客户端 服务器.
接口 实现类 (传递的中间类)
public interface HelloService
public class HelloServiceImpl implements HelloService
public class Call implements Serializable
public class SimpleServer {
private Map remoteObj ects=new HashMap(); //存放远程对象的缓存
/** 把一个远程对象放到缓存中*/
public void register(String className,Object remoteObj ect){
remoteObj ects.put( className,remoteObj ect);
}
public void service()throws Exception{
ServerSocket serverSocket = new ServerSocket(8000);
System.out.println("服务器启动.");
while(true){
Socket socket=serverSocket.accept();
InputStream in=socket.getInputStream();
Obj ectInputStream ois=new Obj ectInputStream(in);
OutputStream out=socket.getOutputStream();
Obj ectOutputStream oos=new Obj ectOutputStream(out);
Call call=(Call)ois.readObj ect(); //接收客户发送的Call 对象
System.out.println(call);
call=invoke(call); //调用相关对象的方法
oos.writeObj ect(call); // 向客户发送包含了执行结果的Call 对象
ois.close();
oos.close();
socket.close();
}
}
public Call invoke(Call call){
Obj ect result=null;
try{
String className=call.getClassName();
String methodName=call.getMethodName();
Obj ect[] params=call.getParams();
Class classType=Class.forName(className);
Class[] paramTypes=call.getParamTypes();
Method method=classType.getMethod(methodName,paramTypes);
Obj ect remoteObj ect=remoteObj ects.get(className); //从缓存中取出相关的远程对象
if(remoteObj ect==null){
throw new Exception(className+"的远程对象不存 ");
}else{
result=method.invoke(remoteObject,params);
}
}catch(Exception e){result=e;}
call.setResult(result); //设置方法执行结果
return call;
}
public static void main(String args[])throws Exception {
SimpleServer server=new SimpleServer();
//把事先创建的HelloServiceImpl 对象加入到服务器的缓存中
server.register("remotecall.HelloService",new HelloServiceImpl());
server.service();
}
public class SimpleClient {
public void invoke()throws Exception{
Socket socket = new Socket("localhost",8000);
OutputStream out=socket.getOutputStream();
Obj ectOutputStream oos=new Obj ectOutputStream(out);
InputStream in=socket.getInputStream();
Obj ectInputStream ois=new Obj ectInputStream(in);
//Call call=new Call("remotecall.HelloService","getTime",
new Class[]{},new Obj ect[]{});
Call call=new Call("remotecall.HelloService","echo",
new Class[]{String.class},new Obj ect[]{"Hello"});
oos.writeObject(call); // 向服务器发送Call 对象
call=(Call)ois.readObj ect(); //接收包含了方法执行结果的Call 对象
System.out.println(call.getResult());
ois.close();
oos.close();
socket.close();
}
public static void main(String args[])throws Exception {
new SimpleClient().invoke();
}
}
分享到:
相关推荐
远程调用技术代码追踪(socket).doc 之二
通过动态代理和socket编程技术实现RMI,远程对象方法的调用。
本文档主要讲述的是Java 远程方法调用RMI参数详解;根据RMI参数意义,可以归结为以下几点,我们可以根据这几点通过优化GC, 网络等待,流传输协议(http/rmi special socket)等方面来优化RMI。
基于mina2的socket通讯实例程序,高度封装了所有socket通讯之前的准备工作,实现远程方法的调用执行定义好目的类与方法后直接调用一个通用方法即可
基于socketServer和socketClient实现的远程Rpc调用Demo
socket服务发布及客户端调用
VC6 Socket 编程 远程获取目录树
使用c#编写基于socket通信的远程控制源码,对于想学习通信相关同学帮助很大
我在学习socket时想做个可以远程控制别人电脑的软件,偷偷整蛊一下朋友,嘿嘿! 在server端开启监听,client端建立连接后,server端可以发送消息给client,client端可以把这条消息CMD执行。然后就嘿嘿嘿...
利用Java开发的socket客户端和服务端远程RPC通信框架,利用了动态代理和反射技术,
java服务器客户端Socket调用基本功能的实现举例
本类目前我用于Socket编程中间远程调用Dao类 不过目前仅适用于调用类的参数类型是字符串型的 返回类型必须能被转换为字符串型方法 例 public String getString String a {return a;}这种方法 支持多个字符串参数方法...
C#异步socket接收组件和调用示例,很好很强大的异步socket组件,共享给大家。
socket 远程电源 读取 写入 socket 连接 控制远程电源 读取远程电源的电压和电流 写入修改远程电源的电压和电流
所以我对socket进行了封装,客户端和服务端可以通过配置注解,让双方相互调用注解方法,提供了专门的工具类,让注解方法可以支持返回list或map等集合或其他的类型,三行代码你就可以完美的使用socket进行通信,支持...
利用delphi的socket开发远程控制的实现
HTML5,Socket接口,例子,HTML5.WebSocket,亲手调试,有图形介绍
通过stub例程实现远程过程调用
Socket调用服务器batSocket调用服务器batSocket调用服务器bat
控制台程序使用Socket类,通过设置IP地址和端口号 登录路由器,并可以对其进行相关设置