package com.webserver.webservice;

 import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.BasicHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils; /**
* Servlet implementation class Prompt
*/
@WebServlet("/Prompt")
public class Prompt extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Map<String, CookieData> cookieMap = new ConcurrentHashMap<String,CookieData>();
public static String yuyinServer = "http://10.3.172.205:8080/RecognizePY/directRecognize";
/**
* @see HttpServlet#HttpServlet()
*/
public Prompt() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String session = request.getParameter("session").trim();
//String token = request.getParameter("token").trim();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/json;charset=utf-8");
String firstCookie = "";
//从原型管理器中获取原型对象
CookieData cookie = cookieMap.get(session);
//原型管理器包含该对象
if(cookie!=null){
firstCookie = cookie.getCookie();
cookie.setAccessDate(System.currentTimeMillis());
} else {
//不包含就创建一个对象 并存到原型管理器中
CookieData tmpCookie = new CookieData();
firstCookie = getCookie();
tmpCookie.setCookie(firstCookie);
tmpCookie.setAccessDate(System.currentTimeMillis());
cookieMap.put(session, tmpCookie);
//根据具体情况 原型对象在原型管理器中存放时间超过规定时间移除改原型对象
cleanCookieMap();
}
//TODO
//.... } /**
* 客户端要记住返回的cookie
* @return
* @throws ClientProtocolException
* @throws IOException
*/
public String getCookie() throws ClientProtocolException, IOException{
String firstCookie = "";
try{
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(yuyinServer);
//设置连接超时时间
client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000);
//设置数据传输超时时间
client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 6000);
HttpResponse response = null;
response = client.execute(post);
if(response.getStatusLine().getStatusCode()==200){
//如果状态码为200,就是正常返回
Header[] cookies = response.getHeaders("Set-Cookie");
for( int i=0;i<cookies.length;i++){
Header curr = cookies[i];
firstCookie += curr.getValue();
}
}
}catch(SocketTimeoutException e){
firstCookie = null;
}
return firstCookie;
} /**
* 送语音数据,拿到识别结果
* @param out
* @return
* @throws IOException
* @throws ClientProtocolException
*/
public String getReconizedResult(byte[] wavbt,String cookie) throws ClientProtocolException, IOException{
String retStr = "";
try {
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000);
client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 6000);
HttpPost post = new HttpPost(yuyinServer);
post.addHeader("Cookie",cookie);
//以流的方式传参数(有两种方式)
//第一中方式
//InputStreamEntity entity = new InputStreamEntity(new ByteArrayInputStream(wavbt), wavbt.length);
//第二种方式
BasicHttpEntity entity = new BasicHttpEntity();
//设置内容
entity.setContent(new ByteArrayInputStream(wavbt));
//设置长度
entity.setContentLength(wavbt.length);
post.setEntity(entity);
HttpResponse response= null;
response = client.execute(post);
String respStr = EntityUtils.toString(response.getEntity());
org.json.JSONObject retJsonObj = new org.json.JSONObject(respStr);
retStr = retJsonObj.getString("result");
saveFile("success",wavbt);
} catch (Exception e) {
System.out.println(e.getMessage());
saveFile("fail",wavbt);
} return retStr;
} public static void saveFile(String flag,byte[] wavbt) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
try (
FileOutputStream fos = new FileOutputStream("d:/test"+flag+ df.format(new Date()) +".wav");
) {
fos.write(wavbt);
} catch (Exception e) { }
} //自定义的原型对象
class CookieData{
/** 访问cookie */
private String cookie; /** 访问时间 */
private long accessDate; /**
* 返回 cookie
* @return cookie
*/
public String getCookie() {
return cookie;
} /**
* 设置 cookie
* @param cookie
*/
public void setCookie(String cookie) {
this.cookie = cookie;
} /**
* 返回 accessDate
* @return accessDate
*/
public long getAccessDate() {
return accessDate;
} /**
* 设置 accessDate
* @param accessDate
*/
public void setAccessDate(long accessDate) {
this.accessDate = accessDate;
}
} //存放时间超过规定时间后清除原型对象
public void cleanCookieMap(){
long currTime = System.currentTimeMillis();
Set<String> keySet = cookieMap.keySet();
Iterator<String> it = keySet.iterator();
while(it.hasNext()){
String key = it.next();
CookieData cookie = cookieMap.get(key);
//如果cookie保存时间超过一小时 则移除
if(currTime - cookie.getAccessDate()> 3600000 ){
cookieMap.remove(key);
}
}
}
}

远程访问(HttpClient和HttpResponse的使用) 原型模式的更多相关文章

  1. 设计模式(六)原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  2. PHP 原型模式

    原型模式:原型模式是先创建好一个原型对象,然后通过拷贝原型对象来创建新的对象.适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可.也可以用作动态 ...

  3. C#设计模式:原型模式(Prototype)及深拷贝、浅拷贝

    原型模式(Prototype) 定义: 原型模式:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.被复制的实例被称为原型,这个原型是可定制的. Prototype Pattern也是一 ...

  4. 设计模式--原型模式Prototype(创建型)

    一.原型模式 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.原型模式实现的关键就是实现Clone函数,还需要实现深拷贝. 二.UML类图 三.例子 //父类 class Resume ...

  5. C#设计模式之原型模式

    原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象. 分析: 孙悟空:根据自己的形状复制(克隆)出多个身外身 软件开发:通过复制一个原型对象得到多个与原型对象一模一样的新对 ...

  6. 设计模式 之 原型模式(ProtoType)

    什么时原型模式   或   原型模式的定义: 用原型实例来指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式的特点: 1),它是面向接口编程, 2),原型模式的新对象是对原型实例的一个克隆 ...

  7. Objective-C 原型模式 -- 简单介绍和使用

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建 ...

  8. C#设计模式-原型模式

    在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中分配 ...

  9. C#设计模式系列:原型模式(Prototype)

    1.原型模式简介 1.1>.定义 原型模式(Prototype)用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象. 1.2>.使用频率 中 1.3>.原型模式应用 首先 ...

随机推荐

  1. codevs——2102 石子归并 2(区间DP)

    时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将石子有次序地 ...

  2. python 设计模式之MVC模式

    一.简单介绍 mvc模式  the  model-view-controller pattern mvc模式是一个运用在软件工程中的设计模式.mvc模式脱离了以前简单的web服务设计逻辑,将开发,测试 ...

  3. CSS:水平居中与垂直居中

    CSS居中算是一个比较基础的问题,在实际运用中,需要考虑到的一般是两种情况,一种是主要是表现为文字,图片等行内元素的居中,一种是指 div 等块级标签元素的居中. 水平居中 1.行内元素 行内元素(主 ...

  4. 受检查异常要求try catch或者throws,但是要记住只要catch异常了,就不会向下继续抛了

    所以在框架中,要想异常被统一的异常拦截器处理,就要将受检查异常转换为运行异常,在受检查异常的catch时候,手动throw new runtime exception

  5. Autolayout 02

    Working with Auto Layout Programmatically 如果你在运行阶段添加或者移除views你就需要通过代码来添加约束来保证你的interface能正确适应size或者o ...

  6. xampp添加 django支持

    apache配置文件中添加 WSGIScriptAlias /chatbot1 /Users/css/djangoprojects/chatbot1/chatbot1/wsgi.pyWSGIPytho ...

  7. myeclipse执行tomcat报错Exception in thread &quot;main&quot; java.lang.OutOfMemoryError: PermGen space

    将myeclipse所配置的tomcat的jdk进行设置:-Xms512m -Xmx512m -XX:MaxNewSize=512m -XX:MaxPermSize=512m,例如以下图:

  8. MySQL触发器 trigger学习

    触发器:一类特殊的事物.可监视某种数据操作,并触发相关操作(insert/update/delete).表中的某些数据改变,希望同一时候能够引起其他相关数据改变的需求. 作用:变化自己主动完毕某些语句 ...

  9. 怎样推断server为虚拟机还是物理真机?

    dmidecode |grep -A20 "Memory Device$"|sed -n -e'/Locator/p' -e '/Size/p'|grep -v "Ban ...

  10. SharePoint 2013 对话框

    The quick way to open a sharepoint 2013 dialog modal form is via Javascript below 1 2 3 4 5 function ...