编写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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值