编写RMI程序的方法

前一段时间学习RMI方式编程,查找很多资料,发现都是比较老的版本jdk,和现在的版本编写方法有些不同,经过琢磨,写了一个简单的例子,希望对需要的人有帮助。

环境:win xp,jdk1.6

 

package guessthecapital;
import java.rmi.Remote;
import java.rmi.RemoteException;


public interface GuessTheCapitalServer extends Remote{
    public boolean register(String name) throws RemoteException;
    public String getCountry(String name) throws RemoteException;
    public String guess(String name,String capital) throws RemoteException;
}

 

package guessthecapital;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RMISecurityManager;
import java.rmi.Naming;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.Calendar;


public class GuessTheCapitalServerApp extends UnicastRemoteObject implements
        GuessTheCapitalServer{
    private static ArrayList<Map> countryList=new ArrayList();
    private static ArrayList<Map> playerList=new ArrayList();
    public GuessTheCapitalServerApp() throws RemoteException {
        super();
        HashMap map=new HashMap();
        map.put("country","afghanistan");
        map.put("capital","kabul");
        countryList.add(map);

        map=new HashMap();
        map.put("country","australia");
        map.put("capital","canberra");
        countryList.add(map);

        map=new HashMap();
        map.put("country","cambodia");
        map.put("capital","phnom penh");
        countryList.add(map);

        ......
    }
    public boolean register(String player) {
        for(int i=0;i<playerList.size();i++){
            if(playerList.get(i).get("player").equals(player.toLowerCase())){
                return false;
            }
        }
        Calendar c=Calendar.getInstance();
        int i=c.get(Calendar.MILLISECOND)%29;
        Map map=new HashMap();
        map.put( "player",player.toLowerCase());
        map.put("pos", i);
        playerList.add(map);
        System.out.println("Player "+player.toUpperCase()+" registered with "+(String)countryList.get(i).get("country"));
        return true;
    }
    public String getCountry(String player) {
        for(int i=0;i<playerList.size();i++){
            if(((String)playerList.get(i).get("player")).equals(player.toLowerCase())){
                int pos=(Integer)playerList.get(i).get("pos");
                return (String)countryList.get(pos).get("country");
            }
        }
        return "No country";
    }
    public String guess(String player, String capital) {
        for(int i=0;i<playerList.size();i++){
            if(((String)playerList.get(i).get("player")).equals(player.toLowerCase())){
                int pos=(Integer)playerList.get(i).get("pos");
                String currCapital=(String)countryList.get(pos).get("capital");
                if(currCapital.equals(capital.toLowerCase())){
                    System.out.println(player.toUpperCase()+":"+((String)countryList.get(i).get("country")).toUpperCase()
                            +":"+((String)countryList.get(i).get("capital")).toUpperCase());
                    return "CORRECT: The capital of "+((String)countryList.get(i).get("country")).toUpperCase()
                            +" is "+capital.toUpperCase();
                }
            }
        }
        return "WRONG: Capital or Player incorrect";
    }

    public static void main(String args[]){
        System.out.println();
        System.out.println("Initialising GuessTheCapitalServer ...");
        if(System.getSecurityManager()==null){
            System.setSecurityManager(new RMISecurityManager());
        }
        try{
            GuessTheCapitalServer guessTheCapitalServer=new GuessTheCapitalServerApp();
            Naming.rebind("GuessTheCapitalServer", guessTheCapitalServer);
            System.out.println("GuessTheCapitalServer Started");
            System.out.println();
        }catch(Exception e){
            System.out.println("GuessTheCapitalServer err:"+e.getMessage());
        }
    }

}

 

package guessthecapital;
import java.rmi.RMISecurityManager;
import java.rmi.Naming;
import java.io.BufferedReader;
import java.io.InputStreamReader;


public class Main {

    public static void main(String args[]) throws Exception {
        if (args.length == 0) {
            System.out.println("error:must input the server,like localhost.");
            return;
        }
        System.setSecurityManager(new RMISecurityManager());
        GuessTheCapitalServer guessTheCapitalServer = (GuessTheCapitalServer) Naming.lookup("//" + args[0] + "/GuessTheCapitalServer");
        BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
        String readLine = "", player = "", inCountry = "", capital = "";
        System.out.println();
        while (!readLine.toLowerCase().equals("q")) {
            System.out.print("Enter player name ('Q' or 'q' to exit):");
            readLine = sin.readLine();
            if (!readLine.toLowerCase().equals("q")) {
                player = readLine;
                if (guessTheCapitalServer.register(player)) {
                    System.out.println("Player " + player.toUpperCase() + " registered.");
                } else {
                    System.out.println("Player has already registered.");
                }
                System.out.println();

                inCountry = guessTheCapitalServer.getCountry(player);
                System.out.print("What is the capital of " + inCountry + " ('Q' or 'q' to exit):");
                readLine = sin.readLine();
                if (!readLine.toLowerCase().equals("q")) {
                    System.out.println(guessTheCapitalServer.guess(player, readLine));
                    System.out.println();
                }
            }
        }
        System.out.println();
        System.out.println("Terminated. Exiting...");
    }
}

 

运行:

编译:

cd F:\student\capitalRMI

javac -d . -cp . *.java

创建安全策略:
policytool:
安全文件:.java.policy
grant {
  permission java.security.AllPermission;
};

生成stub

set classpath=%classpath%;f:\student\capitalRMI

rmic guessthecapital.GuessTheCapitalServerApp

注册
start rmiregistry

运行
另外打开cmd

set classpath=%classpath%;f:\student\capitalRMI

java guessthecapital.GuessTheCapitalServerApp

客户端
set classpath=%classpath%;f:\student\capitalRMI
java guessthecapital.Main localhost

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值