分布式程序设计现在用的地方可多了,但是自己一直没有去了解这方面的内容,今天兴致一来,就找了本书扫了一下盲,并且做了个简单的示例进行了实现,主要是通过java的RMI(Remote method Invoke)来做的,理论这里就不说了,直接从程序上稍作分析。
RMI应用程序编写步骤
1、定义一个Remote接口:(根据文件名称,读取文件内容)
public interface FileInterface extends Remote { public String readFile(String fileName) throws RemoteException; }
2、实现一个Remote接口
public class FileImpl extends UnicastRemoteObject implements FileInterface { protected FileImpl() throws RemoteException { super(); } @Override public String readFile(String fileName) throws RemoteException { try { File file = new File(fileName); StringBuffer sbuffer = new StringBuffer(); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); String str =""; while((str = br.readLine()) != null ) { sbuffer.append(str + "\n"); } return sbuffer.toString(); } catch (Exception e) { System.out.println("FileImpl.readFile(): " + e.getMessage()); e.printStackTrace(); return null; } } }
3、编写Server端程序
public class FileServer { public static void main(String[] args) { int portNum = 9090; if(System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { LocateRegistry.createRegistry(portNum); FileInterface fi = new FileImpl(); Naming.rebind("//127.0.0.1:" + portNum + "//FileServer", fi); System.out.println("Server Start..."); } catch (Exception e) { System.out.println("FileServer: " + e.getMessage()); e.printStackTrace(); } } }
4、编写Client端程序
public class FileClient { public static void main(String[] args) { if(args.length != 3) { System.out.println("Usage: java FileClient filename machinename port"); System.exit(0); } try { String name = "//" + args[1] + ":" + args[2] + "//FileServer"; FileInterface fi = (FileInterface)Naming.lookup(name); String str = fi.readFile(args[0]); System.out.println(str); } catch (Exception e) { System.out.println("FileServer exception: " + e.getMessage()); e.printStackTrace(); } } }
5、生成Stubs和Skeletons,启动服务端和客户端
由于在FileServer中使用的SecurityManager,因此自定义了一个security.policy文件,如下:
grant { permission java.security.AllPermission; };
执行过程,在源代码中存在于run.bat文件中:
javac org/clzps/distributed/FileInterface.java
javac org/clzps/distributed/FileImpl.java
rmic org.clzps.distributed.FileImpl
javac org/clzps/distributed/FileServer.java
javac org/clzps/distributed/FileClient.java
java -Djava.security.policy=org/clzps/distributed/security.policy org.clzps.distributed.FileServer
显示界面如下:
通过客户端访问如下:
java org.clzps.distributed.FileClient D:\Test.txt 127.0.0.1 9090,如下所示: