JAVA RMI 遠程接口調用

摘要: 遠程接口發佈在192.168.100.2服務器上。 服務端:192.168.100.2 客戶端:192.168.100.1 服務器以前通信正常。java

在客戶端編碼:linux

<!-- lang: java -->

package com.itf;spring

import java.rmi.Remote; /**windows

  • 遠程接口定義
  • @author gouwei

*/ public interface RMIInterFace extends Remote{ double add(double a,double b) throws java.rmi.RemoteException; double sub(double a,double b) throws java.rmi.RemoteException; double mul(double a,double b) throws java.rmi.RemoteException; double div(double a,double b) throws java.rmi.RemoteException;安全

}服務器

package com.itf.impl;tcp

import java.rmi.RemoteException;編碼

import com.itf.RMIInterFace; /**spa

  • 遠程接口實現
  • @author gouwei

*/ public class RMIImpl extends java.rmi.server.UnicastRemoteObject implements RMIInterFace{.net

private static final long serialVersionUID = 1L;
  
   public RMIImpl() throws RemoteException {
         super();
  }

   public double add(double a, double b) throws RemoteException {
         return a+b;
  }

   public double sub(double a, double b) throws RemoteException {
         return a-b;
  }

   public double mul(double a, double b) throws RemoteException {
         return a*b;
  }
   public double div(double a, double b) throws RemoteException {
         return a/b;
  }

}

package com.server;

import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry;

import com.itf.RMIInterFace; import com.itf.impl.RMIImpl; /**

  • 服務端註冊
  • @author gouwei

*/ public class RMIServer { public RMIServer(){

try {
              RMIInterFace rmi = new RMIImpl();
               //端口綁定
              System. setSecurityManager(new java.rmi.RMISecurityManager());
              LocateRegistry. createRegistry(4321);
              Naming. bind("rmi://192.168.100.2:4321/RIMServer", rmi);
              System. out.println(">>>>>> INFO:遠程RMIServer綁定【192.168.100.2】成功!" );
        } catch (RemoteException e) {
              System. out.println("建立遠程對象發生異常!" );  
              e.printStackTrace();
        } catch (MalformedURLException e) {
              System. out.println("重複綁定發生異常!" );  
              e.printStackTrace();
        } catch (AlreadyBoundException e) {
              System. out.println("URL異常!" );
              e.printStackTrace();
        }
        
  }
  
   public static void main(String args[]) {
       new RMIServer();
     }

}

package com.client;

import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException;

import com.itf.RMIInterFace; /**

  • 客戶端遠程調用
  • @author gouwei

*/ public class RMIClient {

public static void main(String[] args) {
         try {
              RMIInterFace rmi = (RMIInterFace)Naming.lookup("rmi://192.168.100.2:4321/RIMServer");
               //add
              System. out.println(rmi.add(10, 5));
               //sub
              System. out.println(rmi.sub(10, 5));
               //mul
              System. out.println(rmi.mul(10, 5));
               //div
              System. out.println(rmi.div(10, 5));
        } catch (MalformedURLException e) {
              e.printStackTrace();
        } catch (RemoteException e) {
              e.printStackTrace();
        } catch (NotBoundException e) {
              e.printStackTrace();
        }
  }

}

編碼完成以後,將編譯後的客戶端接口、接口實現類、服務端註冊類、拷貝到192.168.100.2服務器上。 在C盤根目錄編寫安全策略文件 server.policy: grant{ permission java.net.SocketPermission "192.168.100.2:4321","accept,connect,resolve"; };

1、在192.168.100.2上執行命令: (1) start rmiregistry(windows) rmiregistry(linux) (2) cd到bin路勁執行:java com.itf.impl.RMIImpl 生成RMIImpl_Stub.class文件 (3) cd 到bin路勁執行:java -Djava.security.policy=C:\server.policy com.server.RMIServer 輸出: C:\TestRMI_3\bin>java -Djava.security.policy=C:\server.policy com.server.RMIServer

INFO:遠程RMIServer綁定【192.168.100.2】成功!

若是輸出報錯: C:\TestRMI_3\bin>java -Djava.security.policy=C:\server.policy com.server.RMIServ er Exception in thread "main" java.security.AccessControlException: access denied ( java.net.SocketPermission 192.168.100.2:4321 connect,resolve) at java.security.AccessControlContext.checkPermission(AccessControlConte xt.java:323) at java.security.AccessController.checkPermission(AccessController.java: 546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034) at java.net.Socket.connect(Socket.java:513) at java.net.Socket.connect(Socket.java:469) at java.net.Socket.<init>(Socket.java:366) at java.net.Socket.<init>(Socket.java:180) at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirect SocketFactory.java:22) at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMaster SocketFactory.java:128) at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595) at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198 ) at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184) at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322) at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source) at java.rmi.Naming.bind(Naming.java:111) at com.server.RMIServer.<init>(RMIServer.java:20) at com.server.RMIServer.main(RMIServer.java:36)

【更改服務端C:\Program Files\Java\jdk1.6.0_10\jre\lib\security\java.policy 安全策略文件 在文件中加入server.policy中權限內容: permission java.net.SocketPermission "192.168.100.2:4321","accept,connect,resolve"; 或則 permission java.net.SocketPermission "*","accept,connect,resolve"; 而後重複3的操做便可。】 2、在客戶端上執行:

(1) 保留遠程接口和接口實現class,將生成RMIImpl_Stub.class文件拷貝到客戶端「遠程接口實現RMIImpl.class文件同級」。 (2) 運行客戶度程序 cd到bin路勁下執行:java -Djava.security.policy=com.client.RMIClient 輸出: F:\Workspaces\TestRMI_4\bin>java -Djava.security.policy= com.client.RMIClient 15.0 5.0 50.0 2.0

Spring RMI 配置

<!-- RMICLIENT CLIENT-SERVER -->

<bean id="serviceClient"  
        class="org.springframework.remoting.rmi.RmiProxyFactoryBean">  
        <property name="serviceInterface">  
           <value>com.qq.db.DBUser</value>  
       </property>  
       <!-- serviceUrl以rmi開頭,定義服務器地址與端口和服務名 -->  
       <property name="serviceUrl" value="rmi://${servers.server}:${servers.port}/${server.serverName}" />  
       <property name="lookupStubOnStartup">
	     <value>false</value>
	  </property> 
       <property name="refreshStubOnConnectFailure">
			<value>true</value>
	 </property> 
   </bean>
相關文章
相關標籤/搜索