远程访问(HttpClient和HttpResponse的使用) 原型模式

  1 package com.webserver.webservice;
  2 
  3 import java.io.ByteArrayInputStream;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.net.SocketTimeoutException;
  7 import java.text.SimpleDateFormat;
  8 import java.util.Date;
  9 import java.util.Iterator;
 10 import java.util.Map;
 11 import java.util.Set;
 12 import java.util.concurrent.ConcurrentHashMap;
 13 
 14 import javax.servlet.ServletException;
 15 import javax.servlet.annotation.WebServlet;
 16 import javax.servlet.http.HttpServlet;
 17 import javax.servlet.http.HttpServletRequest;
 18 import javax.servlet.http.HttpServletResponse;
 19 
 20 import org.apache.http.Header;
 21 import org.apache.http.HttpResponse;
 22 import org.apache.http.client.ClientProtocolException;
 23 import org.apache.http.client.HttpClient;
 24 import org.apache.http.client.methods.HttpPost;
 25 import org.apache.http.entity.BasicHttpEntity;
 26 import org.apache.http.impl.client.DefaultHttpClient;
 27 import org.apache.http.params.CoreConnectionPNames;
 28 import org.apache.http.util.EntityUtils;
 29 
 30 /**
 31  * Servlet implementation class Prompt
 32  */
 33 @WebServlet("/Prompt")
 34 public class Prompt extends HttpServlet {
 35     private static final long serialVersionUID = 1L;
 36     private static Map<String, CookieData> cookieMap  = new ConcurrentHashMap<String,CookieData>();
 37     public static String yuyinServer = "http://10.3.172.205:8080/RecognizePY/directRecognize"; 
 38     /**
 39      * @see HttpServlet#HttpServlet()
 40      */
 41     public Prompt() {
 42         super();
 43         // TODO Auto-generated constructor stub
 44     }
 45 
 46     /**
 47      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 48      */
 49     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 50         // TODO Auto-generated method stub
 51         this.doPost(request, response);
 52     }
 53 
 54     /**
 55      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 56      */
 57     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 58         String session = request.getParameter("session").trim();
 59         //String token = request.getParameter("token").trim();
 60         response.setCharacterEncoding("UTF-8");
 61         response.setContentType("text/json;charset=utf-8");
 62         String firstCookie = "";
 63         //从原型管理器中获取原型对象
 64         CookieData cookie = cookieMap.get(session);
 65         //原型管理器包含该对象
 66         if(cookie!=null){
 67             firstCookie = cookie.getCookie();
 68             cookie.setAccessDate(System.currentTimeMillis());
 69         } else {
 70             //不包含就创建一个对象 并存到原型管理器中
 71             CookieData tmpCookie = new CookieData();
 72             firstCookie = getCookie();
 73             tmpCookie.setCookie(firstCookie);
 74             tmpCookie.setAccessDate(System.currentTimeMillis());
 75             cookieMap.put(session, tmpCookie);
 76             //根据具体情况 原型对象在原型管理器中存放时间超过规定时间移除改原型对象
 77             cleanCookieMap();
 78         }
 79         //TODO
 80         //....
 81         
 82     }
 83     
 84     
 85     /**
 86      * 客户端要记住返回的cookie
 87      * @return
 88      * @throws ClientProtocolException
 89      * @throws IOException
 90      */
 91     public String getCookie() throws ClientProtocolException, IOException{
 92         String firstCookie = "";
 93         try{
 94             HttpClient client = new DefaultHttpClient();
 95             HttpPost post = new HttpPost(yuyinServer);
 96             //设置连接超时时间
 97             client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000);
 98             //设置数据传输超时时间
 99             client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 6000);
100             HttpResponse response = null;
101             response = client.execute(post);
102             if(response.getStatusLine().getStatusCode()==200){
103                 //如果状态码为200,就是正常返回 
104                 Header[] cookies = response.getHeaders("Set-Cookie");
105                 for( int i=0;i<cookies.length;i++){
106                     Header curr = cookies[i];
107                     firstCookie += curr.getValue();
108                 }
109             }
110         }catch(SocketTimeoutException e){
111             firstCookie = null;
112         }
113         return firstCookie;
114     }
115 
116     /**
117      * 送语音数据,拿到识别结果
118      * @param out
119      * @return
120      * @throws IOException 
121      * @throws ClientProtocolException 
122      */
123     public String getReconizedResult(byte[] wavbt,String cookie) throws ClientProtocolException, IOException{
124         String retStr = "";
125         try {
126             HttpClient client = new DefaultHttpClient();
127             client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000);
128             client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 6000);
129             HttpPost post = new HttpPost(yuyinServer);
130             post.addHeader("Cookie",cookie);
131             //以流的方式传参数(有两种方式)
132             //第一中方式
133             //InputStreamEntity entity  = new InputStreamEntity(new ByteArrayInputStream(wavbt), wavbt.length);
134             //第二种方式
135             BasicHttpEntity entity = new BasicHttpEntity();  
136             //设置内容  
137             entity.setContent(new ByteArrayInputStream(wavbt)); 
138             //设置长度  
139             entity.setContentLength(wavbt.length);  
140             post.setEntity(entity);
141             HttpResponse response= null;
142             response = client.execute(post);
143             String respStr = EntityUtils.toString(response.getEntity());
144             org.json.JSONObject retJsonObj = new org.json.JSONObject(respStr);
145             retStr = retJsonObj.getString("result");
146             saveFile("success",wavbt);
147         } catch (Exception e) {
148             System.out.println(e.getMessage());
149             saveFile("fail",wavbt);
150         }
151         
152         return retStr; 
153     }
154 
155     public static void saveFile(String flag,byte[] wavbt) {
156         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
157         try (
158             FileOutputStream fos = new FileOutputStream("d:/test"+flag+ df.format(new Date()) +".wav");
159         ) {
160             fos.write(wavbt);
161         } catch (Exception e) {
162             
163         }
164     }
165     
166     //自定义的原型对象
167     class CookieData{
168         /** 访问cookie */
169         private String cookie;
170     
171         /** 访问时间 */
172         private long accessDate;
173 
174         /**
175          * 返回 cookie
176          * @return cookie
177          */
178         public String getCookie() {
179             return cookie;
180         }
181 
182         /**
183          * 设置 cookie
184          * @param cookie
185          */
186         public void setCookie(String cookie) {
187             this.cookie = cookie;
188         }
189 
190         /**
191          * 返回 accessDate
192          * @return accessDate
193          */
194         public long getAccessDate() {
195             return accessDate;
196         }
197 
198         /**
199          * 设置 accessDate
200          * @param accessDate
201          */
202         public void setAccessDate(long accessDate) {
203             this.accessDate = accessDate;
204         }
205     }
206     
207     //存放时间超过规定时间后清除原型对象
208     public void cleanCookieMap(){
209         long currTime = System.currentTimeMillis();
210         Set<String> keySet = cookieMap.keySet();
211         Iterator<String> it = keySet.iterator();
212         while(it.hasNext()){
213             String key = it.next();
214             CookieData cookie = cookieMap.get(key);
215             //如果cookie保存时间超过一小时 则移除
216             if(currTime - cookie.getAccessDate()> 3600000 ){
217                 cookieMap.remove(key);
218             }
219         }
220     }
221 }

 

posted on 2014-07-22 18:22  欲上云端  阅读(703)  评论(0编辑  收藏  举报