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 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器