使用WebService实现远程调用
? ?上篇博客讲解了使用Socket实现远程调用,今天这篇讲解WebService实现远程调用。首先在开发之前,我们应该有自己的思路,心里面想好开发的大体步骤,然后我们可以开始开发了。下面是我在写的时候的一个思路,一起展示给大家。 首先需要有客户端和服务端 服务端: 创建一个接口(天气查询服务SEI)public interface WeatherInterface {
String getWeatherByCityName(String cityName);
}
SEI实现类@WebService
public class WeatherInterfaceImpl implements WeatherInterface {
@Override
public String getWeatherByCityName(String cityName) {
System.out.println("接收到客户端发送的城市名称:" + cityName);
//查询天气
String resultString = "暖和点儿了";
System.out.println("返回天气信息:" + resultString);
return resultString;
}
}
创建天气查询服务发布类? 这里我们建议端口号为1024以后的,因为1024以下好多都是系统的端口号,容易起冲突。 public class WeatherServer {
public static void main(String[] args) {
//第一个参数:服务发布的url
//第二个参数:SEI实现类对象
Endpoint.publish("http://127.0.0.1:12345/weather",new WeatherInterfaceImpl());
}
}
查看服务是否启动,出现如下图则说明发布成功。使用wsdl
查看wsdl:访问服务发布地址+?wsdl
我们只需要 注意service 和targetNamespace可以使用wsimport工具生成客户端调用代码。
?在学之前,先简单介绍一下,wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码)无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码,服务端通过客户端代码调用webservice。
使用方法:
常用参数为: -d<目录> ?- 将生成.class文件。默认参数。 -s<目录> - 将生成.java文件(一般都使用这个)。 -p<生成的新包名> -将生成的类,放于指定的包下。如果不指定包名就是wsdl命名空间的倒序。 (wsdlurl) - http://server:port/service?wsdl,必须的参数。 示例: C:/> wsimport -s . http://127.0.0.1:1234/weather?wsdl? 注意:-s不能分开,-s后面有个小点 新建一个工程,找到工程的src目录:刷新之后我们看到客户端生成了如下代码:一般我们用WeatherInterfaceImpl,和WeatherInterfaceImplService叫做服务视图,就够了。 客户端的开发步骤。实现步骤: 第一步:创建一个java工程 第二步:创建一服务视图对象 第三步:从服务视图中获得PortType对象 第四步:调用PortType的方法(可以实现远程通信) 第五步:接收方法的返回值(服务端响应的结果) 第六步:打印结果。 public class WeatherClient {
public static void main(String[] args) {
//创建服务视图
WeatherInterfaceImplService service = new WeatherInterfaceImplService();
//从服务视图中获得PortType对象
WeatherInterfaceImpl portType = service.getWeatherInterfaceImplPort();
//调用服务端方法
String weatherInfo = portType.getWeatherByCityName("北京");
System.out.println(weatherInfo);
}
}
最终我们看到的结果:客户端控制台: 小结:?既然之前写了socket实现远程通信调用,小结里面就写一写两者的区别吧。 Webservice和sockt的对比 Socket:使用流通信,需要自定义协议。编程复杂。 优点:通信效率高,速度快,适合于传输大数据。 缺点:编程复杂。 Webservice:封装所有通信的细节,只需要像调用本地方法一样使用即可。很方便。 优点:编程简单。面向对象开发。 缺点:传输效率低。不适合传输大数据的情况。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |