tianzizhi3 2011-09-20 13:48
浏览 162
已采纳

关于rmi的疑惑,请熟悉的朋友指点一下

第一我想问的是 调远程的方法时,是把远程的实现类下载到客户端再执行吗,我怎么感觉是这样的,在服务器端写的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,请大家说说

  • 写回答

1条回答 默认 最新

  • DreamZhong 2011-09-20 16:56
    关注

    LiebaoServiceImpl需要继承UnicastRemoteObject类,并且我看你的LiebaoServiceImpl 实现接口有些多余, Service已经继承Remote接口,根本不需要再实现Remote接口,而且不明白你实现Serializable接口有什么用。
    public LiebaoServiceImple extends UnicastRemoteObject implements Service{

    }

    如果还不明白请参见
    [url]http://dreamzhong.iteye.com/admin/blogs/1140526[/url]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 matlab求解平差
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法