问题描述
第一我想问的是 调远程的方法时,是把远程的实现类下载到客户端再执行吗,我怎么感觉是这样的,在服务器端写的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;@Overridepublic List<Entity> list(String id,String name) {// TODO Auto-generated method stubSystem.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 blocke.printStackTrace();} catch (RemoteException e) {// TODO Auto-generated catch blocke.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(){@Overridepublic 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 blocke.printStackTrace();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NotBoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} } 【客户端输出会报错误(空指针): coming........... coming........... XXXXXXXXX其它的信息(服务器端业务类信息) Caused by: java.lang.NullPointerExceptionat com.jdbc.ConnectionFactory.getConn服务器那不打印任何信息如不调业务方法test(),list方法只返回个字符串或自己new个Entity和ArrayList返回则没有问题,不知道这种情况是咋回事,如何解决,我想的是客户端只接收结果的,怎么产生的结果由服务器负责,为什么现在不是这样呢,初次搞rmi,请大家说说
解决方案
LiebaoServiceImpl需要继承UnicastRemoteObject类,并且我看你的LiebaoServiceImpl 实现接口有些多余, Service已经继承Remote接口,根本不需要再实现Remote接口,而且不明白你实现Serializable接口有什么用。public LiebaoServiceImple extends UnicastRemoteObject implements Service{}如果还不明白请参见http://dreamzhong.iteye.com/admin/blogs/1140526