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 }