本本主要是详细为大家解析了发送短信的同步/异步发送短信的代码实例,发送短信的方法也许有很多,而主要的方法是使用服务商提供的服务,通常情况下,这一些服务都是与语言无关的,这里我们使用java写示例程序。
1、发送短信的接口
根据自己的情况选择服务商。
2、开发文档
从开发文档中我们能看到,可直接使用http请求也能够使用WebService请求发送短信。因为DEMO文件夹下的java和jsp文件夹中的代码都是使用http请求发送短信,因此在此就不再细说了,我们使用WebService的方式演示发送短信。
3、生成客户端代码
从接口文档中我们明白它的WebService的WSDL的url为: http://106.ihuyi.cn/webservice/sms.php?WSDL 那么我们可执行如下命令生成客户端代码:
wsimport -keep http://106.ihuyi.cn/webservice/sms.php?WSDL
其中wsimport是JDK自带的工具,-keep url选项是"保留生成的文件"。该命令会在当前目录下生成sms.cn.ihuyi._106包,和众多的类。接下来开始编写我们自己的代码。
4、定义接口
为了方便在此先定义一个接口:
Sms.java
public interface Sms { /** * 向mobile发送短信, 内容为message * * @param mobile 手机号码 * @param message 短信内容 * @return 成功返回-1, 否则就返回其他值 */ int sendMessage(String mobile, String message); }
这个接口非常的简单,只有一个方法,这一个方法是用来发送短信的。
5、同步发送短信
接首先实现一个同步发送短信的类:
IhuyiSmsImpl.java
public class IhuyiSmsImpl implements Sms { private String account; private String password; public void setAccount(String account) { this.account = account; } public void setPassword(String password) { this.password = password; } @Override public int sendMessage(String mobile, String message) { cn.ihuyi._106.Sms factory = new cn.ihuyi._106.Sms(); SmsSoap smsSoap = factory.getSmsSoap(); SubmitResult submit = smsSoap.submit(account, password, mobile, message); int code = submit.getCode(); if(code == 2){ return -1; } System.out.println("发送短信失败, code:" + code); return code; } }
第17行能够获得远程对象的一个代理对象,接着就能通过这一代理对象进行发送短信以及查询账户余额等操作了。
第18行使用该代理对象的submit方法提交了短信内容,这个方法的参数信息以及返回值含义在接口文档中有详细的说明。
第19行获得了结果的状态码,根据文档上的说明,状态码为2则说明提交成功了,为了简单起见,在此只关注提交成功的情况。需要说明的是状态码为2只是说明提交成功。根据官网上的"3-5秒内响应、100%到达",我们可推测,要是提交成功那么基本上3-5秒内短信就会发送成功,根据用户的网络情况,也许会稍有延迟用户就可以收到短信。
使用这一段代码发送短信也非常的简单,直接new一个对象,设置好账号及密码就能发短信了。
6、异步发送短信
由于发送短信涉会及到网络通信,所以sendMessage方法或许会有一些延迟。为了改善用户的体验,可以使用异步发送短信的方法。
原理非常的简单:要是用户请求发送短信,我们不是直接调用IhuyiSmsImpl的sendMessage方法,而是先把请求保存起来(生产者),接着告诉用户:短信发送成功,然后会有若干个消费者取出任务,调用sendMessage方法发送短信。
在此使用线程池来完成上面的任务:
AsyncSmsImpl.java
public class AsyncSmsImpl implements Sms { public Sms sendSms; private ExecutorService executorService = Executors.newFixedThreadPool(3); public void setSendSms(Sms sendSms) { this.sendSms = sendSms; } @Override public int sendMessage(String mobile, String message) { try { executorService.submit(() -> sendSms.sendMessage(mobile, message)); } catch(Exception e) { Sysemt.out.println("提交任务时发生错误" + e); return 0; } return -1; } public void destroy(){ try{ executorService.shutdown(); } catch(Exception e){} } }
代码非常的简单,直接把Sms接口的sendMessage(mobile, message)方法作为一个任务加到线程池的任务队列中。这样的话等到有空闲线程的时候,就会执行sendSms.sendMessage(mobile, message)发送短信。在此假设只需要保存到线程池就能够成功发送短信,因为发送失败的情况实际上是非常罕见的。
至上,同步/异步发送短信就算完成了,不知道大家都理解了没有,快收藏此文章多研究一下吧。