软文采集器(如何通过本地客户端远程访问服务端进行数据采集,存储和查询)
优采云 发布时间: 2021-11-25 23:10软文采集器(如何通过本地客户端远程访问服务端进行数据采集,存储和查询)
本期概述
上一期我们学习了html页面采集之后的数据查询,但这只是本地查询数据库。如果我们想通过远程操作进行数据采集、存储和查询,我们应该怎么做?羊毛布?
今天一起来学习一下:如何通过本地客户端远程访问服务器,存储和查询数据采集。
数据采集页2011-2012英超球队战绩
学习简单的远程访问(RMI 示例)
首先,让我们学习一个客户端远程访问服务器的简单示例。
这里使用Java RMI(远程方法调用)
Java RMI 是一种机制,它使 Java 虚拟机能够调用另一个 Java 虚拟机上的对象上的方法以实现远程访问。
但是,要通过客户端实现这种远程访问,必须绑定一个远程接口对象(意味着客户端可以访问的服务器上的方法都必须收录在该接口中)。
好的,让我们写下示例代码。
定义远程接口
首先,我们需要编写一个远程接口HelloInterface,它继承了远程对象Remote。
在接口HelloInterface中有一个sayHello方法,用于在连接后向客户端打招呼。
由于sayHello方法继承了远程Remote对象,所以需要抛出RemoteException。
package Remote_Interface;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.rmi.Remote;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.rmi.RemoteException;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">/**<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> * 接口HelloInterface 继承了 远程接口 Remote 用于客户端Client远程调用<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> * @author SoFlash - 博客园 http://www.cnblogs.com/longwu<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">*/<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">public interface HelloInterface extends Remote{<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">public String sayHello(String name) throws RemoteException; <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">}
实现接口(在服务端实现接口)
接下来我们实现接口中的方法,实现接口的方法在服务端。
这里的 HelloInterfaceImpl 类实现了接口 HelloInterface 中的方法。
注意:这里HelloInterfaceImpl也继承了U优采云tRemoteObject远程对象,这个必须要写,虽然智能提示不写代码不会提示错误,但是服务端启动后会莫名其妙的报错。
由于 U优采云tRemoteObject 远程对象需要抛出 RemoteException,因此使用构造函数 HelloInterfaceImpl() 抛出此异常。
package Server;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.rmi.RemoteException;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.rmi.server.UnicastRemoteObject;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import Remote_Interface.HelloInterface;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">/**<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> * HelloInterfaceImpl 用于实现 接口HelloInterface 的远程 SayHello方法<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> * @author SoFlash - 博客园 http://www.cnblogs.com/longwu<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">*/<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">@SuppressWarnings("serial")<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">// 继承 UnicastRemoteObject 远程对象 这个一定要写 否则 服务端启动报异常<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">public class HelloInterfaceImpl extends UnicastRemoteObject implements HelloInterface{<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">//HelloInterfaceImpl的构造方法 用于抛出UnicastRemoteObject 远程对象里的异常<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> protected HelloInterfaceImpl() throws RemoteException {<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> }<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">public String sayHello(String name) throws RemoteException {<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">//该信息 在客户端上发出<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> String strHello = "你好! " + name+" 欢迎访问服务端!";<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">//这条信息 是在服务端上 打印出来<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> System.out.println(name +" 正在 访问本服务端!");<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">return strHello;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> }<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">}
写服务器
接下来我们来写服务端,因为RMI实现远程访问的机制是指:客户端通过在RMI注册表中查找远程接口对象的地址(服务器地址)来达到远程访问的目的。
因此,我们需要在服务端创建一个远程对象注册中心来绑定和注册服务端地址和远程接口对象,以便后面的客户端可以成功找到服务端(详见代码注释)。
package Server;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.net.MalformedURLException;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.rmi.AlreadyBoundException;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.rmi.Naming;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.rmi.RemoteException;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.rmi.registry.LocateRegistry;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import Remote_Interface.HelloInterface;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">/**<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> * Server 类 用于 启动 注册服务端<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> * @author SoFlash - 博客园 http://www.cnblogs.com/longwu<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">*/<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">public class Server {<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">public static void main(String[] args) {<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">try {<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">// 定义远程接口HelloInterface 对象 用于绑定在服务端注册表上 该接口由HelloInterfaceImpl()类实现<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> HelloInterface hInterface = new HelloInterfaceImpl();<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">int port = 6666; // 定义一个端口号<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">// 创建一个接受对特定端口调用的远程对象注册表 注册表上需要接口一个指定的端口号<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> LocateRegistry.createRegistry(port);<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">// 定义 服务端远程地址 URL格式<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> String address = "rmi://localhost:" + port + "/hello";<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">// 绑定远程地址和接口对象<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> Naming.bind(address,hInterface);<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">// 如果启动成功 则弹出如下信息<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> System.out.println(">>>服务端启动成功");<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> System.out.println(">>>请启动客户端进行连接访问");<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> } catch (MalformedURLException e) {<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> System.out.println("地址出现错误!");<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> e.printStackTrace();<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> } catch (AlreadyBoundException e) {<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> System.out.println("重复绑定了同一个远程对象!");<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> e.printStackTrace();<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> } catch (RemoteException e) {<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> System.out.println("创建远程对象出现错误!");<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> e.printStackTrace();<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> }<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> }<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">}
写客户端
服务器就完成了,下面我们来写下访问服务器所需的客户端。
客户端还需要定义一个远程访问地址——即服务器地址,
然后,通过查找 RMI 注册表上的地址;如果找到,则建立连接。
<p>package Client;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.net.MalformedURLException;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.rmi.Naming;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.rmi.NotBoundException;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import java.rmi.RemoteException;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">import Remote_Interface.HelloInterface;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">/**<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> * Client 用于连接 并访问 服务端Server<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> * @author SoFlash - 博客园 http://www.cnblogs.com/longwu<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">*/<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">public class Client {<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">public static void main(String[] args) {<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">// 定义一个端口号 该端口号必须与服务端的端口号相同<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> int port = 6666;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">// 同样定义一个远程地址 该地址为服务端的远程地址 所以 与服务端的地址是一样的<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> String address = "rmi://localhost:" + port + "/hello";<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">// 在RMI注册表上需找 对象为HelloInterface的地址 即服务端地址 <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> try {<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> HelloInterface hInterface = (HelloInterface) Naming.lookup(address);<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">// 一旦客户端找到该服务端地址 则 进行连接<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> System.out.println("