1. 程式人生 > >RMI幾種釋出和引用服務的方式

RMI幾種釋出和引用服務的方式

RMI是Java原生的分散式服務機制,支援Java對Java的分散式訪問,採用Java的序列化協議進行CodeC操作。這裡簡單說下RMI釋出服務和客戶端引用服務的方式。

RMI釋出服務時支援兩種方式,一種是RMI本身的釋出協議,另外一種是採用通用的JNDI的方式來發布服務。

採用JMI本身的釋出協議,可以使用Registry介面,也可以使用Naming工具類。

使用Registry介面時,bind的服務名稱只需要直接寫服務名稱就行,RMI內部會把它變成rmi://ip:port/servicename的方式

public class Server {
	public static void main(String[] args){
		try {
			DemoService service = new DemoServiceImpl("ITer_ZC");                        
                        //指定埠
			Registry registry = LocateRegistry.createRegistry(8888); 
                        // 註冊服務
			registry.bind("demoservice",service);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("DemoService is running at Server");
	}
}
採用Naming工具類時,需要指定完整的URI方式時的服務名稱。值得注意的是,也需要先繫結埠號,否則會報ConnectionRefuse的異常
public class Server {
	public static void main(String[] args){
		try {
			DemoService service = new DemoServiceImpl("ITer_ZC");
                        // 指定埠
			LocateRegistry.createRegistry(8888); 
                        //完整的URI方式的服務名稱
		        Naming.bind("rmi://10.2.43.50:8888/demoservice",service);  
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("DemoService is running at Server");
	}
}

採用JNDI的方式來發布RMI服務,需要指定完整的URI方式的服務名稱
public class Server {
	public static void main(String[] args){
		try {
			DemoService service = new DemoServiceImpl("ITer_ZC");
			Registry registry = LocateRegistry.createRegistry(8888); 
			Context nameContext = new InitialContext();
			nameContext.rebind("rmi://10.2.43.50:8888/demoservice", service);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("DemoService is running at Server");
	}
}


客戶端引用RMI服務時,也可以採用兩種方式來尋找服務,一種是RMI本身的類,一種是JNDI介面的類。

採用RMI本身的類來引用RMI服務

public class Client {
	public static void main(String[] args){
		String url = "rmi://10.2.43.50:8888/demoservice";
		try {
			DemoService service = (DemoService)Naming.lookup(url);
			System.out.println(service.sayHi());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

採用JNDI介面來引用RMI服務

public class Client {
	public static void main(String[] args){
		String url = "rmi://10.2.43.50:8888/demoservice";
		Context nameContext;
		try {
			nameContext = new InitialContext();
			DemoService service = (DemoService)nameContext.lookup(url);
			System.out.println(service.sayHi());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}