在项目中远程调用另一个项目的简单实现
2012-10-27 14:11
288 查看
由于公司的项目是分开的,刚到公司其它人都在做其它的项目,所以这个SMS项目交到我一人手上。由我写一个中间SMS平台用于支持和服务于其它项目。用于短信的接收和发送以及发送成功,失败,响应的一系列处理。做了一个月终于做完了。话说以前的毕业设计也是一个人做了一个月。没想到刚到公司就一个人做一个项目。真是相当无语。还好,完成任务。不过目前还在试用期,努力ing。。
SMS项目本身就没什么好说的。使用简单的JDBC+Servlet架构就实现了。本来是使用ssh做的,但说实话ssh太过庞大,ssh搭好后发现速度也不是很快,最后被我鄙弃,直接采用原生SQL的jdbc进行处理。写一个DBCP的连接池就足够了。加上一个通用的DAO,写上通用的增删改查[包括存储过程],然后建立3层整个项目的架构便搭建完毕。剩下的就是开发了。至于短信怎么收发就不说了。JAVA收发短信的速度是非常快的。我的手机光测试收发短信就花了起码500条以上了,没找公司报销。当然前提是我的数据库也已经设计好了。由于是中间项目,和各平台的具体业务无关。所以表是非常少的。主要用来记录各平台短信的收发。
既然与各平台无关,那各平台怎么和我通信呢。用WebService?RMI?EJB?no,他们都太过繁琐。远程调用我们可以有很多种方法。这里我选用的是HttpURLconnection。因为它可以直接使用,方便快速。
[java] view
plaincopy
/**
* @author lz
* 远程连接
* @param strUrl
* @param json
* @return
*/
@SuppressWarnings("finally")
public static String getConnectionJson(String strUrl, String json) {
// 存放响应结果
String sTotalString = "";
int result=0;
HttpURLConnection httpConn = null;
OutputStream os = null;
OutputStreamWriter osw = null;
try {
URL url = new URL(strUrl);
httpConn = (HttpURLConnection) url.openConnection();
HttpURLConnection.setFollowRedirects(true);// 支持跳转
httpConn.setDoOutput(true);
httpConn.setUseCaches(false);//POST不使用缓存
httpConn.setRequestMethod("POST");
httpConn.setRequestProperty("Content-Type", "text/html");
// 设置连接超时时间
httpConn.setConnectTimeout(30000);
// 设置读取超时时间
httpConn.setReadTimeout(30000);
httpConn.connect();
os = httpConn.getOutputStream();
osw = new OutputStreamWriter(os);
osw.write(json.toCharArray(), 0, json.length());
osw.flush();
// 读取响应数据
int code = httpConn.getResponseCode();
if (httpConn.getConnectTimeout() == 0) {
System.out.println("请求超时!");
result=1;
}
// 是否正常响应
if (code == 200) {
String sCurrentLine = "";
// 读取响应数据
InputStream is = httpConn.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
while ((sCurrentLine = reader.readLine()) != null) {
if (sCurrentLine.length() > 0) {
sTotalString = sTotalString + sCurrentLine.trim();
}
}
is.close();
//System.out.println("OOOO:"+sTotalString);
return sTotalString;
} else {
result=1;
//sTotalString="远程服务器连接失败,错误代码:" + code;
}
} catch (Exception e) {
result=1;
//sTotalString="远程服务器异常:" + e.getMessage();
} finally {
if (osw != null && os != null && httpConn != null) {
try {
// 关闭流
osw.close();
os.close();
} catch (final IOException e) {
e.printStackTrace();
}
// 断开连接
httpConn.disconnect();
}
if(result==1){
return DataPackUtils.returnData(Const.connError, 2);
}
return sTotalString;
}
}
这个方法就是我写的一个通用远程访问的方法。使用json封装然后转成数组用流的方式进行传递。
使用json进行封装是方便读取,而写成流的原因是为了防止被人截取,如果使用明文的话无疑是给别人暴露你所有的数据。就像CSDN前几天使用明文保存密码一个道理。
然后的服务端接收流进行读取。
[java] view
plaincopy
/**
* 将reauest里的数据包转成字符串
*
* @param request
* @return String
*/
public static String getRequestBodyTxt(HttpServletRequest request)
{
// 接收手机传过来的参数
BufferedInputStream bufferedInputStream = null;
// 此类实现了一个输出流,其中的数据被写入一个字节数组
ByteArrayOutputStream bytesOutputStream = null;
String body = null;
try
{
// BufferedInputStream 输入流
bufferedInputStream = new BufferedInputStream (
request.getInputStream ());
bytesOutputStream = new ByteArrayOutputStream ();
// 写入数据
int ch;
while ((ch = bufferedInputStream.read ()) != -1)
{
bytesOutputStream.write (ch);
}
// 转换为String类型
body = new String (bytesOutputStream.toByteArray (),"UTF-8");
}catch (Exception ex)
{
ex.printStackTrace ();
}
finally
{
// 关闭此输入流并释放与该流关联的所有系统资源。
try
{
bytesOutputStream.flush ();
bytesOutputStream.close ();
bufferedInputStream.close ();
}catch (IOException e)
{
e.printStackTrace ();
}
}
return body;
}
接收完毕使用response.getWriter().write();输出流,将结果返回给客户端。这样就完成了一次简单的远程通信。
客户端只须将相应的数据传递给服务端即可。
那有人可能会说了。如果是别人发送数据给服务端怎么办?你也接收错误数据并发送短信么?
当然不是,远程连接是要有安全验证的。
客户端传递过来的不仅仅是一个数据包,还包括一个加密的MD5.服务端接收后会根据来源获取相应的客户平台的Key并对数据包进行再次加密后得到的md5和客户端传过来的md5进行匹配,如果匹配通过,才能发送相应短信。而且发送短信也要经过平台用户名与密码的验证。双重验证,保证数据安全有效。
打这样一个比方,比如别人寄一个箱子你,但你们怕中间有人拿走箱子中间的东东,怎么办?那就是给箱子加把锁。对方用它的钥匙加锁后,寄给你。你在根据相应的人取出相应的钥匙打开箱子即可。不过如今话说md5也不安全,因为很多简单的密码,一眼或者使用穷举法就可以暴力破解。所以使用md5时建议使用md5加盐,这样数据就安全得多了。
HttpURLConnection小巧方便,用它完成一次通信,实在是不错的选择。
SMS项目本身就没什么好说的。使用简单的JDBC+Servlet架构就实现了。本来是使用ssh做的,但说实话ssh太过庞大,ssh搭好后发现速度也不是很快,最后被我鄙弃,直接采用原生SQL的jdbc进行处理。写一个DBCP的连接池就足够了。加上一个通用的DAO,写上通用的增删改查[包括存储过程],然后建立3层整个项目的架构便搭建完毕。剩下的就是开发了。至于短信怎么收发就不说了。JAVA收发短信的速度是非常快的。我的手机光测试收发短信就花了起码500条以上了,没找公司报销。当然前提是我的数据库也已经设计好了。由于是中间项目,和各平台的具体业务无关。所以表是非常少的。主要用来记录各平台短信的收发。
既然与各平台无关,那各平台怎么和我通信呢。用WebService?RMI?EJB?no,他们都太过繁琐。远程调用我们可以有很多种方法。这里我选用的是HttpURLconnection。因为它可以直接使用,方便快速。
[java] view
plaincopy
/**
* @author lz
* 远程连接
* @param strUrl
* @param json
* @return
*/
@SuppressWarnings("finally")
public static String getConnectionJson(String strUrl, String json) {
// 存放响应结果
String sTotalString = "";
int result=0;
HttpURLConnection httpConn = null;
OutputStream os = null;
OutputStreamWriter osw = null;
try {
URL url = new URL(strUrl);
httpConn = (HttpURLConnection) url.openConnection();
HttpURLConnection.setFollowRedirects(true);// 支持跳转
httpConn.setDoOutput(true);
httpConn.setUseCaches(false);//POST不使用缓存
httpConn.setRequestMethod("POST");
httpConn.setRequestProperty("Content-Type", "text/html");
// 设置连接超时时间
httpConn.setConnectTimeout(30000);
// 设置读取超时时间
httpConn.setReadTimeout(30000);
httpConn.connect();
os = httpConn.getOutputStream();
osw = new OutputStreamWriter(os);
osw.write(json.toCharArray(), 0, json.length());
osw.flush();
// 读取响应数据
int code = httpConn.getResponseCode();
if (httpConn.getConnectTimeout() == 0) {
System.out.println("请求超时!");
result=1;
}
// 是否正常响应
if (code == 200) {
String sCurrentLine = "";
// 读取响应数据
InputStream is = httpConn.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
while ((sCurrentLine = reader.readLine()) != null) {
if (sCurrentLine.length() > 0) {
sTotalString = sTotalString + sCurrentLine.trim();
}
}
is.close();
//System.out.println("OOOO:"+sTotalString);
return sTotalString;
} else {
result=1;
//sTotalString="远程服务器连接失败,错误代码:" + code;
}
} catch (Exception e) {
result=1;
//sTotalString="远程服务器异常:" + e.getMessage();
} finally {
if (osw != null && os != null && httpConn != null) {
try {
// 关闭流
osw.close();
os.close();
} catch (final IOException e) {
e.printStackTrace();
}
// 断开连接
httpConn.disconnect();
}
if(result==1){
return DataPackUtils.returnData(Const.connError, 2);
}
return sTotalString;
}
}
这个方法就是我写的一个通用远程访问的方法。使用json封装然后转成数组用流的方式进行传递。
使用json进行封装是方便读取,而写成流的原因是为了防止被人截取,如果使用明文的话无疑是给别人暴露你所有的数据。就像CSDN前几天使用明文保存密码一个道理。
然后的服务端接收流进行读取。
[java] view
plaincopy
/**
* 将reauest里的数据包转成字符串
*
* @param request
* @return String
*/
public static String getRequestBodyTxt(HttpServletRequest request)
{
// 接收手机传过来的参数
BufferedInputStream bufferedInputStream = null;
// 此类实现了一个输出流,其中的数据被写入一个字节数组
ByteArrayOutputStream bytesOutputStream = null;
String body = null;
try
{
// BufferedInputStream 输入流
bufferedInputStream = new BufferedInputStream (
request.getInputStream ());
bytesOutputStream = new ByteArrayOutputStream ();
// 写入数据
int ch;
while ((ch = bufferedInputStream.read ()) != -1)
{
bytesOutputStream.write (ch);
}
// 转换为String类型
body = new String (bytesOutputStream.toByteArray (),"UTF-8");
}catch (Exception ex)
{
ex.printStackTrace ();
}
finally
{
// 关闭此输入流并释放与该流关联的所有系统资源。
try
{
bytesOutputStream.flush ();
bytesOutputStream.close ();
bufferedInputStream.close ();
}catch (IOException e)
{
e.printStackTrace ();
}
}
return body;
}
接收完毕使用response.getWriter().write();输出流,将结果返回给客户端。这样就完成了一次简单的远程通信。
客户端只须将相应的数据传递给服务端即可。
那有人可能会说了。如果是别人发送数据给服务端怎么办?你也接收错误数据并发送短信么?
当然不是,远程连接是要有安全验证的。
客户端传递过来的不仅仅是一个数据包,还包括一个加密的MD5.服务端接收后会根据来源获取相应的客户平台的Key并对数据包进行再次加密后得到的md5和客户端传过来的md5进行匹配,如果匹配通过,才能发送相应短信。而且发送短信也要经过平台用户名与密码的验证。双重验证,保证数据安全有效。
打这样一个比方,比如别人寄一个箱子你,但你们怕中间有人拿走箱子中间的东东,怎么办?那就是给箱子加把锁。对方用它的钥匙加锁后,寄给你。你在根据相应的人取出相应的钥匙打开箱子即可。不过如今话说md5也不安全,因为很多简单的密码,一眼或者使用穷举法就可以暴力破解。所以使用md5时建议使用md5加盐,这样数据就安全得多了。
HttpURLConnection小巧方便,用它完成一次通信,实在是不错的选择。
相关文章推荐
- 在项目中远程调用另一个项目的简单实现
- 在项目中远程调用另一个项目的简单实现
- 在项目中远程调用另一个项目的简单实现
- Java远程调用(二)实现一个简单的服务框架
- Java远程调用(二)实现一个简单的服务框架
- Hessian实现远程调用的简单案例
- RMI(远程方法调用)实现简单的查单词功能
- Python中实现远程调用(RPC、RMI)简单例子
- 远程方法调用简单实现
- RMI(远程方法调用)实现简单的查单词功能
- rpc远程调用的简单实现
- 使用AIDL实现IPC通信之——简单调用远程服务的方法
- Java远程调用BPS流程实现流程运行简单示例
- 【DLL相关】实现函数的DLL封装,并在另一个项目中调用
- python xmlrpc实现二进制文件传输的代码,简单的远程调用
- 【远程调用框架】如何实现一个简单的RPC框架(五)优化三:软负载中心设计与实现
- 【远程调用框架】如何实现一个简单的RPC框架(一)想法与设计
- 简单的RMI远程调用框架架实现
- rmi经典实例---远程调用简单实现方式
- 【远程调用框架】如何实现一个简单的RPC框架(三)优化一:利用动态代理改变用户服务调用方式