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 }