资源描述
电信增值业务及软件开发一
实践报告
学 院: 软件学院 专 业: 软件工程
班 级: 学 号:
姓 名2: 指导老师:
2013年 06月 22日
实验一:短消息MO指令匹配算法
一、 实验步骤及实验结果
实验代码:
#include<iostream.h〉
#include<string。h〉
void main()
{
char S[100];
char T[50];
cin〉>S;
cin>〉T;
int len1,len2;
int len;
int next[100];
int i,j;
int k;
int count=0;
len1=strlen(S);
len2=strlen(T);
len=len1-len2;
j=1,k=0;
next[1]=0;
while(j〈len2)
{
if(k==0||T[j-1]==T[k-1])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
i=0;
j=0;
while(j!=len2&&i〈len1)
{
count++;
if(S[i]!=T[j])
{
if(j==0)
i++;
else
j=next[j+1]—1;
}
else
{
i++;
j++;
}
}
cout<〈len1<〈endl;
cout<〈i<〈endl;
cout〈〈j〈〈endl;
if(j==len2)
{
cout<<”匹配成功,初始匹配成功的位置为第:"〈〈i—len2+1<〈"个字符”<<endl;
cout〈<"匹配次数为:”〈〈count〈〈endl;
}
else
{
cout〈<”匹配次数为:”<〈count<〈endl;
cout〈〈"匹配失败”<〈endl;
}
}
二、实验截图:
二、 心得:
通过这次实验,用C/C++/C#或Java编程实现短消息MO指令匹配算法,该算法能够实现短消息MO指令的长号码和指令内容的模糊和精确匹配、空指令匹配功能。
实验二:短消息增值业务软件开发平台及接口
一、实验步骤及实验结果
( 1 )实验内容“根据短信增值业务软件开发平台的操作手册熟悉短信增值业务软件开发平台”的实验步骤如下:
登陆短信增值业务平台
http://172。22.118.16:8081/sms/
创建一个属于自己的业务,按需求和格式定义业务名称、指令类型、匹配方式、资费、处理方式、通道并送发审核。
实验结果
短信成功接收到,并且程序返回值为“0"
结果分析
通过平台下发的测试短信最终预期收到。说明在平台上创建的业务通道,格式正确。并且已经通过管理员的审核,能够合法的使用平台提供的通道资源。测试代码的发送成功还说明在程序中调用平台接口的方式是正确的.
( 2 )实验内容“根据短消息增值业务软件开发平台的接口手册,熟悉短消息增值业务软件开发平台的HTTP接口、API接口、Web Service接口等的使用方法”的实验步骤如下:
http接口的参数定义格式:
在程序中调用已通过审核的业务
String url = ”http://172。22.118.16:8081/sms/http/SendSms”;
// 读取接口传递过来的参数并封装数据
RequestData rd = new RequestData();
rd。setPhone("15923932303”);
rd.setServiceId("2”);
rd。setChannelId("1");
rd.setDestNumber("1”);
rd。setLinkId(””);
rd.setMoId(””);
rd.setSpNumber(”");
rd.setFunctionType("");
rd。setType(””);
通过程序来实现短信的下发
代码实现:
MainClass。java
package com.cqupt.http;
public class MainClass {
String phone = ””;
public MainClass() {
String mtMsg = ””;
String commString = ”";
String url = ”http://172.22.118.16:8081/sms/http/SendSms";
// 读取接口传递过来的参数并封装数据
RequestData rd = new RequestData();
rd。setPhone(”15923932303”);
rd。setServiceId("2”);
rd.setChannelId("1");
rd。setDestNumber(”1");
rd。setLinkId("");
rd。setMoId("");
rd。setSpNumber(””);
rd.setFunctionType(””);
rd。setType("");
// 业务逻辑判断
mtMsg = "第二条测试信息”;
rd.setMtMsg(mtMsg);
// 拼接数据
commString = RequestUtil.getInstance()。commString(rd);
// 转发到重邮平台
RequestUtil。getInstance()。requestURL(commString, url);
}
public static void main(String[] args) {
MainClass mainClass = new MainClass();
}
}
RequestData.java
package com.cqupt。http;
public class RequestData {
private String phone;
private String destNumber;
private String serviceId;
private String channelId;
private String linkId;
private String moId;
private String spNumber;
private String functionType;
private String type;
private String content;
private String mtMsg;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this。phone = phone;
}
public String getDestNumber() {
return destNumber;
}
public void setDestNumber(String destNumber) {
this。destNumber = destNumber;
}
public String getServiceId() {
return serviceId;
public void setServiceId(String serviceId) {
this.serviceId = serviceId;
}
public String getChannelId() {
return channelId;
}
public void setChannelId(String channelId) {
this。channelId = channelId;
}
public String getLinkId() {
return linkId;
}
public void setLinkId(String linkId) {
this。linkId = linkId;
}
public String getMoId() {
return moId;
}
public void setMoId(String moId) {
this。moId = moId;
}
public String getSpNumber() {
return spNumber;
}
public void setSpNumber(String spNumber) {
this。spNumber = spNumber;
}
public String getFunctionType() {
return functionType;
}
public void setFunctionType(String functionType) {
this.functionType = functionType;
}
public String getType() {
return type;
}
public void setType(String type) {
this。type = type;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getMtMsg() {
return mtMsg;
}
public void setMtMsg(String mtMsg) {
this.mtMsg = mtMsg;
}
}
RequestUtil。java
package com。cqupt。http;
import java.io.BufferedReader;
import java.io。InputStreamReader;
import java。io.OutputStream;
import java.io.UnsupportedEncodingException;
import 。HttpURLConnection;
import 。URL;
import java。net。URLEncoder;
public class RequestUtil {
private RequestUtil() {
}
private static RequestUtil requestUtil = null;
/**
* 单例模式,返回RequestUtil的实例化对象
*
* @return requestUtil
*/
public static RequestUtil getInstance() {
if (requestUtil == null) {
requestUtil = new RequestUtil();// 需要的时候才new,节省空间.
}
return requestUtil;
}
/**
* 拼接字符串
* @param rd 传递的参数封装成的包信息
* @return commString 拼接好的请求信息字符串
*/
public String commString(RequestData rd) {
String commString = "";
try {
commString = "userName=2012123667&password=123&phone=" + rd.getPhone() + "&destNumber=" + rd.getDestNumber() + "&serviceId=” + rd。getServiceId()
+ "&channelId=” + rd.getChannelId() + ”&linkId=" + rd.getLinkId() + "&moId=” + rd.getMoId() + "&spNumber=" + rd.getSpNumber() + ”&content="
+ URLEncoder。encode(rd.getMtMsg(), "UTF—8”) + ”&functionType=” + rd。getFunctionType() + ”&type=" + rd.getType() + ”& =3";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return commString;
}
/**
* 将结果短信转发到指定的平台
* @param commString 请求字符串
* @param address 信息发送的目的URL地址
* @return rec_string 发送结果内容
*/
public String requestURL(String commString, String address) {
String rec_string = ””;
URL url = null;
HttpURLConnection urlConn = null;
try {
url = new URL(address);
urlConn = (HttpURLConnection) url。openConnection();
urlConn.setConnectTimeout(30000);
urlConn。setReadTimeout(30000);
urlConn.setRequestMethod("POST");
urlConn.setDoOutput(true);
OutputStream out = urlConn.getOutputStream();
out。write(commString。getBytes("GBK”));
out。flush();
out。close();
BufferedReader rd = new BufferedReader(new InputStreamReader(urlConn。getInputStream(), ”UTF-8"));
StringBuffer sb = new StringBuffer();
int ch;
while ((ch = rd。read()) 〉 -1) {
sb.append((char) ch);
}
System。out。println(sb.toString());
rec_string = sb。toString()。trim();
rd.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (urlConn != null) {
urlConn。disconnect();
}
}
return rec_string;
}
}
1。根据短信增值业务软件开发平台的接口手册熟悉短信增值业务软件开发平台的HTTP接口等。
2.调用短信增值业务软件开发平台的HTTP接口,编写一个Web程序实现“趣味答题”短信增值业务.
实验步骤
创建业务
因为本次实验要调用HTTP接口,所以我们在选在处理方式的时候要选择HTTP转发
提交审核
审核通过
业务实现
数据库设计
根据整个项目情况可以看出这个业务平台需要的数据表:用户答题信息表User_message、题目信息表title_message。
title_message表结构
字段
类型
默认值
描述
Id
Number(10)
主键
titleType
Varchar2(30)
题目类型
consequence
Varchar2(10)
题目答案
titleNumber
Number(10)
题目题号
content
Varchar2(100)
题目内容
user_message表结构
字段
类型
默认值
描述
Id
Varchar2(100)
主键
phone
Number(10)
手机号码
titleType
Number(10)
回答题目类型
countNumber
Number(10)
回答题目数
successNumber
Number(10)
答对题目数
errorNumber
Number(10)
答错题目数
三、 心得
通过本次实验熟悉了大汉三通公司的短信增值业务软件开发平台,掌握了短息增值业务软件的入门知识。但目前还只是初步会使用大汉三通公司封装打包提供的功能,自己对于底层的实现还不能够明确掌握。
实验三:基于HTTP接口的短消息编程
一、 实验步骤及实验结果
1、将文件mpay_sms_http导入Myeclipse中
2、 配置web.xml如图
3、发布工程及修改路径
4、访问工程
在地址栏中输URL: http://127.0。0。1:8080/mpay_sms_http/http/httpTest 回车得到
发布工程中在<host>〈/host〉中加入代码
〈Host name="localhost” appBase=”webapps”
unpackWARs="true" autoDeploy="true"
xmlValidation=”false” xmlNamespaceAware="false">
〈Context path=”/mpay_sms_http" docBase="C:\Documents and Settings\Administrator\Workspaces\MyEclipse 8.x\mpay_sms_http\WebRoot”〉
〈/Context〉
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html ——〉
〈!—-
〈Valve className="org.apache.catalina。authenticator。SingleSignOn" />
——>
〈!-— Access log processes all example。
Documentation at: /docs/config/valve。html -—〉
〈!-—
〈Valve className="org.apache。catalina.valves。AccessLogValve" directory="logs"
prefix="localhost_access_log.” suffix=".txt” pattern=”common" resolveHosts=”false”/>
--〉
</Host〉
创建数据库
输入密码进入配置界面
输入show databases;命令查看已经存在的数据库
输入create database test 得到
5、使用navicat新建数据库将答题的数据输入,如图
上传提交
二、心得
熟悉短信增值业务软件开发平台HTTP接口等,掌握短信增值业务软件开发的HTTP接口编程.
实验四:基于API接口的短消息编程
一、 实验步骤及实验结果
本次试验是建立在“短信增值业务软件开发平台HTTP接口程序设计”的基础上,本次试验中的信息处理类和DAO是在第七次实验的基础上稍加修改,这里我们就不做过多的解释。
1。创建一个业务
2.提交审核
3。审核通过
4.业务实现
数据库设计
根据整个项目情况可以看出这个业务平台需要的数据表:用户答题信息表User_message、题目信息表title_message。
title_message表结构
字段
类型
默认值
描述
Id
Number(10)
主键
titleType
Varchar2(30)
题目类型
consequence
Varchar2(10)
题目答案
titleNumber
Number(10)
题目题号
content
Varchar2(100)
题目内容
user_message表结构
字段
类型
默认值
描述
Id
Varchar2(100)
主键
phone
Number(10)
手机号码
titleType
Number(10)
回答题目类型
countNumber
Number(10)
回答题目数
successNumber
Number(10)
答对题目数
errorNumber
Number(10)
答错题目数
创建API接口测试类http_api.java
package com。dahantc.api;
import com.dahantc.utils。channelUtils;
public class api_Demo {
public static void main(String[] args) {
String host = ”172.18.2。185”;// 短信实验平台地址
int port = 28020;// 短信实验平台的服务端口(ctc端口)——默认为28020
String user = ”student”;// 用户账号
String passwd = ”123”;// 用户密码
int serviceId = 1;// 业务ID-——自己申请的业务ID号
int channelId = 1;// 通道ID-—-根据实际情况填写
channelUtils。getInstance().initChannel(host, port, user, passwd, channelId, serviceId);
}
}
创建一个MD5。java
来提供上行业务MD5的加密方式
package com.dahantc.utils
import java.security.MessageDigest;
public class MD5 {
public static final String encode(String sourceString) {
String resultString = null;
try {
resultString = new String(sourceString);
MessageDigest md = MessageDigest。getInstance(”MD5");
resultString = byte2hexString(md.digest(resultString。getBytes()));
} catch (Exception ex) {
}
return resultString;
}
private static final String byte2hexString(byte[] bytes) {
StringBuffer bf = new StringBuffer(bytes.length * 2);
for (int i = 0; i 〈 bytes。length; i++) {
if ((bytes[i] & 0xff) < 0x10) {
bf。append("0");
}
bf。append(Long。toString(bytes[i] & 0xff, 16));
}
return bf.toString();
}
}
创建一个SMSCallBackImpl.java类
处理上行短息,下行状态报告和响应报告的功能
package com.dahantc。utils;
import com.chinatricom.message.IDeliverMsg;
import com。chinatricom.message。IReportMsg;
import com.chinatricom。message.ISubmitMsg;
import com。chinatricom。slidewindow。SMSCallback;
import com。chinatricom。smsclient。message.DeliverMsg;
import com.chinatricom。smsclient.message.ReportMsg;
import com.chinatricom。smsclient。message。SubmitMsg;
/**
* 该类提供处理上行短信、下行状态报告和响应报告的功能,实现SMSCallback接口的相应方法即可,程序会自动调用相应的方法进行处理
*
* @author dahantc
*/
public class SMSCallbackImpl implements SMSCallback {
@Override
public boolean onDeliverSMS(IDeliverMsg arg0) {
// 处理上行短信
DeliverMsg msg = (DeliverMsg) arg0;
if (msg != null) {
String from = msg。getFrom();// 手机号
String to = msg。getTo();// 上行服务号
String content = msg。getMsg();// 短信内容
int mtTypeId = msg.getMtTypeId();// 短信类型1:点播2:定制3:退订4:普通路由参数
System.out。println("收到deliverMsg:phone=” + from + ",内容=” + content + ",to=" + to + ",mtTypeId=” + mtTypeId);
System.out。println("开始进行业务逻辑处理。。。。..”);
String _command = PropReadUtil.getInstance().getResources(”command");// 命令
if (!content.trim()。equals(_command)) {
content = content。substring(_command.length(), content.length());
}
String _msg = LogicUtil.getInstance().judgment(content, from);
System。out。println("开始发送短信:" + _msg);
/**
* 此处发送短信在下一步进行创建,暂时先写在这里
*/
boolean _ret = channelUtils。getInstance().sendSMS(msg。getChanId(), msg.getServiceId(), from, _msg);
System.out.println("result:” + _ret);
}
return true;
}
@Override
public boolean onSubmitedSMS(ISubmitMsg arg0) {
// 处理下行响应
SubmitMsg msg = (SubmitMsg) arg0;
if (msg != null) {
String smsID = msg。getReserve();
String msgID = msg.getMsgId();
int result = msg。getResult();
String to = msg.getTo();
System.out。println("收到submit response,to=” + to + ",smsID=” + smsID
+ ",msgID=" + msgID + ”,result=” + result);
}
return true;
}
@Override
public boolean onMTReportSMS(IReportMsg arg0) {
// 处理状态报告
ReportMsg msg = (ReportMsg) arg0;
if (msg != null) {
String msgID = msg.getMsgid();// msgId
int result = msg。getResult();// 0:成功1:等待发送2:失败
System。out.println(”收到repot,msgID=" + msgID + ",result=” + result);
}
return true;
}
}
二、结果
用eclipse运行工程,如果返回"hello word” 就说明项目成功.
三、结果分析
用eclipse运行工程,。看到如下内容:
说明在平台上创建的业务通道,格式正确。并且已经通过管理员的审核,能够合法的使用平台提供的通道资源。API调用方式正确,并且成功调用API接口连接到短信平台。过程中配置的数据库等配置文件和创建的工具类都没有发生逻辑和语法错误。
四、心得
熟悉短信增值业务软件开发平台API接口,掌握短信增值业务软件开发的API接口编程。实验过程中还掌握通过类库来实现MD5的创建和编写,能够在以后的程序编程中提供加密的功能。
实验五:短消息增值业务编程
一、 实验步骤及实验结果
创建一个业务
3。提交审核
4。审核通过
二、实现
平台的数据表:
用户答题信息表User_message、投票选手信息Person_message.
Person_message表结构
字段
类型
默认值
描述
Id
Number(10)
主键
Name
Varchar2(30)
选手姓名
Rank
Varchar2(10)
选手排名
user_message表结构
字段
类型
默认值
描述
Id
Varchar2(100)
主键
phone
Number(10)
手机号码
数据库链接功能
package com.dahantc。utils;
import java.sql。Connection;
import java。sql.DriverManager;
import java。sql.ResultSet;
import java.sql.SQLException;
import java.sql。PreparedStatement;
public class JdbcUtil {
private static String DB_DRIVER = PropReadUtil。getInstance()。getResources("dbDriver”);
private static String DB_URL = PropReadUtil。getInstance().getResources("dbURL");
private static String DB_USER = PropReadUtil。getInstance()。getResources("dbUser");
private static String DB_PASSWORD = PropReadUtil.getInstance()。getResources(”dbPassword”);
private static JdbcUtil _jdbcUtil = null;
private JdbcUtil() {
}
public static JdbcUtil getInstance() {
if (null == _jdbcUtil) {
_jdbcUtil = new JdbcUtil();
}
return _jdbcUtil;
}
public Connection getConnection() throws ClassNotFoundException, SQLException {
Class。forName(DB_DRIVER);// 注册驱动;
return DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);// 获取数据库连接;
}
public void close(ResultSet rs, PreparedStatement stmt, Connection conn) {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
展开阅读全文