关于写过关于JAVA采集入库的三篇文章:
分别实现了
①抓取页面信息并显示
②简单采集入库存储
③调用本地数据库查询
④远程调用实现操作(未实现)
以上这些功能都是基于本地的,有时候我们需要远程去调用这类数据,这时我们就可以用JAVA提供的RMI机制实行远程调用访问。
什么是RMI?
RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。调用这样一个对象时,其参数为 "marshalled" 并将其从本地虚拟机发送到远程虚拟机(该远程虚拟机的参数为 "unmarshalled")上。该方法终止时,将编组来自远程机的结果并将结果发送到调用方的虚拟机。如果方法调用导致抛出异常,则该异常将指示给调用方。
简单了解下RMI,看下简单实现吧
1、定义远程接口
首先,我们需要写个远程接口IHello 该接口继承了远程对象Remote.
接口IHello里面有个hello的方法,用于客户端连接后 打招呼.
由于IHello继承了远程Remote对象, 所以需要抛一个 RemoteException 远程异常.
1 importjava.rmi.Remote;2 importjava.rmi.RemoteException;3
4
5 public interface IHello extendsRemote{6
7 public String hello(String name) throwsRemoteException;8 }
2、实现接口
接下来,我们实现下 该接口里的方法, 实现接口的方法在服务端.
这里的HelloImpl类 实现了接口IHello里的方法.
注意:这里HelloImpl同样继承了 UnicastRemoteObject 远程对象,这个必须写,不然服务端启动后会莫名其妙报错.
1 importjava.rmi.RemoteException;2 importjava.rmi.server.UnicastRemoteObject;3
4 /**
5 * UnicastRemoteObject 这个必须写,虽然不写代码也不会出错,但在运行服务器的时候会出现莫名错误6 *@authorBalla_兔子7 *8 */
9 public class HelloImpl extends UnicastRemoteObject implementsIHello {10
11 protected HelloImpl() throwsRemoteException {12 super();13 }14
15 @Override16 publicString hello(String name) {17 String strHello="你好!"+name+"正在访问服务端";18 System.out.println(name+"正在访问服务端");19 returnstrHello;20 }21
22 }
3、编写服务端
服务端,由于RMI实现远程访问的机制是指:客户端通过在RMI注册表上寻找远程接口对象的地址(服务端地址) 达到实现远程访问的目的,
所以,我们需要在服务端创建一个远程对象的注册表,用于绑定和注册 服务端地址 和 远程接口对象,便于后期客户端能够成功找到服务端
1 importjava.rmi.Naming;2 importjava.rmi.RemoteException;3 importjava.rmi.registry.LocateRegistry;4
5
6 public classServer {7
8 /**
9 *@paramargs10 */
11 public static voidmain(String[] args) {12 try{13 IHello hello=newHelloImpl();14 int port=6666;15 LocateRegistry.createRegistry(port);16 String address="rmi://localhost:"+port+"/tuzi";17 Naming.bind(address, hello);18 System.out.println(">>>服务端启动成功");19 System.out.println(">>>请启动客户端进行连接访问..");20
21 } catch(Exception e) {22 e.printStackTrace();23 }24 }25
26 }
4、编写客户端
客户端上同样需要定义一个 远程访问的地址 - 即服务端地址,
然后,通过在RMI注册表上寻找该地址; 如果找到 则建立连接.
1 importjava.net.MalformedURLException;2 importjava.rmi.Naming;3 importjava.rmi.NotBoundException;4 importjava.rmi.RemoteException;5 importjava.util.Scanner;6
7
8 public classClient {9 public static voidmain(String[] args) {10
11 int port=6666;12 String address="rmi://localhost:"+port+"/tuzi";13 try{14 IHello hello=(IHello) Naming.lookup(address);15 System.out.println("<<
17 System.out.println(hello.hello("Rabbit"));18 Scanner scanner=newScanner(System.in);19 String input=scanner.next();20 } catch(MalformedURLException e) {21 //TODO Auto-generated catch block
22 e.printStackTrace();23 } catch(RemoteException e) {24 //TODO Auto-generated catch block
25 e.printStackTrace();26 } catch(NotBoundException e) {27 //TODO Auto-generated catch block
28 e.printStackTrace();29 }30
31 }32 }
运行效果图:
华丽的分割线
接下来就来看看我们的程序吧,今天换种口味来采集下《2013-2014赛季常规赛排名》
先上效果图: