第一我想问的是 调远程的方法时,是把远程的实现类下载到客户端再执行吗,我怎么感觉是这样的,在服务器端写的system.out.println
会在客户端输出,在服务器端没出现,在客户端调用的方法时,如果此方法在服务端调用了其它方法时(在客户端没有执行的环境,只能在服务器那执行,如连数据库操作)会在客户端报错,客户端没有这个环境你当然不能执行啊,
我想像的rmi,只要你把服务器方法返回的结果给客户端就行了,至于中间的调用过程怎么拿到客户端去执行啊,求大家说明一下这是什么状况,想不通了
下面是部分代码
服务接口
public interface Service extends Remote{
public List<Entity> list(String id,String name);
}
服务实现
public class LiebaoServiceImpl implements Service,Remote,Serializable{
/**
* uid
*/
private static final long serialVersionUID = 1L;
@Override
public List<Entity> list(String id,String name) {
// TODO Auto-generated method stub
System.out.println("coming...........");
System.out.println("coming...........");
List<Entity> list = new ArrayList<Entity>();
Test t = new Test();
list = t.test();//执行业务操作并返回(这里会在客户端出错,到客户端执行了)
return list;
}
}
//绑定jndi服务
public class InitJndiService {
public void init(){
Properties pros = new Properties();
pros.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
pros.put(Context.PROVIDER_URL, "rmi://localhost:1099");
try {
LocateRegistry.createRegistry(1099);
InitialContext ini = new InitialContext(pros);
Service service = new ServiceImpl();
ini.bind("Service", service);
ini.close();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}
客户端调用:
public static void main(String[] arg){
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
System.setSecurityManager(new SecurityManager(){
@Override
public void checkPermission(Permission perm) {
// TODO Auto-generated method stub
}
});
try {
InitialContext ctx = new InitialContext();
Service service = (Service)ctx.lookup("Service");
System.out.println(service.List("3444","ddd"));
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NotBoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
【客户端输出会报错误(空指针):
coming...........
coming...........
XXXXXXXXX其它的信息(服务器端业务类信息)
Caused by: java.lang.NullPointerException
at com.jdbc.ConnectionFactory.getConn
服务器那不打印任何信息
如不调业务方法test(),list方法只返回个字符串或自己new个Entity和ArrayList返回则没有问题,
不知道这种情况是咋回事,如何解决,
我想的是客户端只接收结果的,怎么产生的结果由服务器负责,为什么现在不是这样呢,初次搞rmi,请大家说说