在项目中远程调用另一个项目的简单实现

来源:互联网 发布:淘宝发货流程查看 编辑:程序博客网 时间:2024/05/16 11:31

由于公司的项目是分开的,刚到公司其它人都在做其它的项目,所以这个SMS项目交到我一人手上。由我写一个中间SMS平台用于支持和服务于其它项目。用于短信的接收和发送以及发送成功,失败,响应的一系列处理。做了一个月终于做完了。话说以前的毕业设计也是一个人做了一个月。没想到刚到公司就一个人做一个项目。真是相当无语。还好,完成任务。不过目前还在试用期,努力ing。。

SMS项目本身就没什么好说的。使用简单的JDBC+Servlet架构就实现了。本来是使用ssh做的,但说实话ssh太过庞大,ssh搭好后发现速度也不是很快,最后被我鄙弃,直接采用原生SQL的jdbc进行处理。写一个DBCP的连接池就足够了。加上一个通用的DAO,写上通用的增删改查[包括存储过程],然后建立3层整个项目的架构便搭建完毕。剩下的就是开发了。至于短信怎么收发就不说了。JAVA收发短信的速度是非常快的。我的手机光测试收发短信就花了起码500条以上了,没找公司报销。当然前提是我的数据库也已经设计好了。由于是中间项目,和各平台的具体业务无关。所以表是非常少的。主要用来记录各平台短信的收发。

既然与各平台无关,那各平台怎么和我通信呢。用WebService?RMI?EJB?no,他们都太过繁琐。远程调用我们可以有很多种方法。这里我选用的是HttpURLconnection。因为它可以直接使用,方便快速。

[java] view plaincopy
  1. /** 
  2.      * @author lz 
  3.      * 远程连接 
  4.      * @param strUrl 
  5.      * @param json 
  6.      * @return 
  7.      */  
  8.     @SuppressWarnings("finally")  
  9.     public static String getConnectionJson(String strUrl, String json) {  
  10.         // 存放响应结果  
  11.         String sTotalString = "";  
  12.         int result=0;  
  13.         HttpURLConnection httpConn = null;  
  14.         OutputStream os = null;  
  15.         OutputStreamWriter osw = null;  
  16.         try {  
  17.             URL url = new URL(strUrl);  
  18.             httpConn = (HttpURLConnection) url.openConnection();  
  19.             HttpURLConnection.setFollowRedirects(true);// 支持跳转  
  20.             httpConn.setDoOutput(true);  
  21.             httpConn.setUseCaches(false);//POST不使用缓存  
  22.             httpConn.setRequestMethod("POST");  
  23.             httpConn.setRequestProperty("Content-Type""text/html");  
  24.             // 设置连接超时时间  
  25.             httpConn.setConnectTimeout(30000);  
  26.             // 设置读取超时时间  
  27.             httpConn.setReadTimeout(30000);  
  28.             httpConn.connect();  
  29.             os = httpConn.getOutputStream();  
  30.             osw = new OutputStreamWriter(os);  
  31.             osw.write(json.toCharArray(), 0, json.length());  
  32.             osw.flush();  
  33.   
  34.             // 读取响应数据  
  35.             int code = httpConn.getResponseCode();  
  36.   
  37.             if (httpConn.getConnectTimeout() == 0) {  
  38.                 System.out.println("请求超时!");  
  39.                 result=1;  
  40.             }  
  41.             // 是否正常响应  
  42.             if (code == 200) {  
  43.                 String sCurrentLine = "";  
  44.   
  45.                 // 读取响应数据  
  46.                 InputStream is = httpConn.getInputStream();  
  47.   
  48.                 BufferedReader reader = new BufferedReader(  
  49.                         new InputStreamReader(is));  
  50.                 while ((sCurrentLine = reader.readLine()) != null) {  
  51.                     if (sCurrentLine.length() > 0) {  
  52.                         sTotalString = sTotalString + sCurrentLine.trim();  
  53.                     }  
  54.                 }  
  55.                 is.close();  
  56.                 //System.out.println("OOOO:"+sTotalString);  
  57.                 return sTotalString;  
  58.             } else {  
  59.                 result=1;  
  60.                 //sTotalString="远程服务器连接失败,错误代码:" + code;  
  61.             }  
  62.         } catch (Exception e) {  
  63.             result=1;  
  64.             //sTotalString="远程服务器异常:" + e.getMessage();  
  65.         } finally {  
  66.             if (osw != null && os != null && httpConn != null) {  
  67.                 try {  
  68.                     // 关闭流  
  69.                     osw.close();  
  70.                     os.close();  
  71.                 } catch (final IOException e) {  
  72.                     e.printStackTrace();  
  73.                 }  
  74.                 // 断开连接  
  75.                 httpConn.disconnect();  
  76.             }  
  77.             if(result==1){  
  78.                 return DataPackUtils.returnData(Const.connError, 2);  
  79.             }  
  80.             return sTotalString;  
  81.         }  
  82.     }  

这个方法就是我写的一个通用远程访问的方法。使用json封装然后转成数组用流的方式进行传递。

使用json进行封装是方便读取,而写成流的原因是为了防止被人截取,如果使用明文的话无疑是给别人暴露你所有的数据。就像CSDN前几天使用明文保存密码一个道理。

然后的服务端接收流进行读取。

[java] view plaincopy
  1. /** 
  2.      * 将reauest里的数据包转成字符串 
  3.      *  
  4.      * @param request 
  5.      * @return String 
  6.      */  
  7.     public static String getRequestBodyTxt(HttpServletRequest request)  
  8.     {  
  9.         // 接收手机传过来的参数  
  10.         BufferedInputStream bufferedInputStream = null;  
  11.         // 此类实现了一个输出流,其中的数据被写入一个字节数组  
  12.         ByteArrayOutputStream bytesOutputStream = null;  
  13.         String body = null;  
  14.         try  
  15.         {  
  16.             // BufferedInputStream 输入流  
  17.             bufferedInputStream = new BufferedInputStream (  
  18.                 request.getInputStream ());  
  19.             bytesOutputStream = new ByteArrayOutputStream ();  
  20.             // 写入数据  
  21.             int ch;  
  22.             while ((ch = bufferedInputStream.read ()) != -1)  
  23.             {  
  24.                 bytesOutputStream.write (ch);  
  25.             }  
  26.             // 转换为String类型  
  27.             body = new String (bytesOutputStream.toByteArray (),"UTF-8");  
  28.         }catch (Exception ex)  
  29.         {  
  30.             ex.printStackTrace ();  
  31.         }  
  32.         finally  
  33.         {  
  34.             // 关闭此输入流并释放与该流关联的所有系统资源。  
  35.             try  
  36.             {  
  37.                 bytesOutputStream.flush ();  
  38.                 bytesOutputStream.close ();  
  39.                 bufferedInputStream.close ();  
  40.             }catch (IOException e)  
  41.             {  
  42.                 e.printStackTrace ();  
  43.             }  
  44.         }  
  45.         return body;  
  46.     }  
接收完毕使用response.getWriter().write();输出流,将结果返回给客户端。这样就完成了一次简单的远程通信。

客户端只须将相应的数据传递给服务端即可。

那有人可能会说了。如果是别人发送数据给服务端怎么办?你也接收错误数据并发送短信么?

当然不是,远程连接是要有安全验证的。

客户端传递过来的不仅仅是一个数据包,还包括一个加密的MD5.服务端接收后会根据来源获取相应的客户平台的Key并对数据包进行再次加密后得到的md5和客户端传过来的md5进行匹配,如果匹配通过,才能发送相应短信。而且发送短信也要经过平台用户名与密码的验证。双重验证,保证数据安全有效。

打这样一个比方,比如别人寄一个箱子你,但你们怕中间有人拿走箱子中间的东东,怎么办?那就是给箱子加把锁。对方用它的钥匙加锁后,寄给你。你在根据相应的人取出相应的钥匙打开箱子即可。不过如今话说md5也不安全,因为很多简单的密码,一眼或者使用穷举法就可以暴力破解。所以使用md5时建议使用md5加盐,这样数据就安全得多了。

HttpURLConnection小巧方便,用它完成一次通信,实在是不错的选择。