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. Network| ICMP

    Internet Control Message Protocol,ICMP是网路协议族的核心协议之一.它用于TCP/IP网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,令管 ...

  2. vue.js移动端app实战2

    貌似有部分人要求写的更详细,这里多写一点vuel-cli基础的配置 什么是vue-cli? 官方的解释是:A simple CLI for scaffolding Vue.js projects,简单 ...

  3. GCJ——Minimum Scalar Product(2008 Round1 AA)

    题意: 给定两组各n个数,可任意调整同一组数之中数字的顺序,求 sum xi*yi i=1..n的最小值. Small: n<=8 abs xy,yi<=1000 Large: n< ...

  4. delphi的^和@的作用

    Pint:^string;在这里将^放在数据类型之前,说明是声明的字符串指针类型!如果想取出指针引用的值的话,就将^放在声明的类型后就可以了,比如:Pint^想取Pint类型的所引用地址的话,就将@放 ...

  5. 【IntelliJ Idea】idea下hibernate反向生成工具,根据数据表生成实体

    idea插件很齐全,不像ecplise一样.所以直接来步骤吧: 1.选择项目,右键-->Add Frameworks Support-->勾选Hibernate-->勾选Import ...

  6. 在Android中实现阴影效果

    在Android L推出后,Google提出了全新的设计语言:材质设计.其中很重要的一点就是阴影效果的使用,你可以为每一个View设置一个elevation值,相当于除了x.y之外的z值,z值决定了阴 ...

  7. 如何简单去掉dede后台的验证码 dedecms5.7 验证码怎么去掉

    很多朋友都在找,如何去掉dede后台的验证码,每次登陆都很繁琐.        现在教大家一个dedecms5.7 验证码怎么去掉的最直接的方法: 在dedecms5.7[验证码安全设置]里,说修改后 ...

  8. todo提纲

    deep&wide为啥work,如何优化特征:详述attention,attention在ctr预估中如何使用,din为啥work?详述transformer,如何应用于ctr预估;item2 ...

  9. C++课程资源下载问题

    [来信] 贺老师,您好,我是江西某高校软件学院的一名在校学生.看了您在csdn上公布的博文和视频,我获益良多.不得不承认,之前的大学时光我是荒废了,立即就要大三了,我主攻的是C++方面.因此我悔过自新 ...

  10. @Cacheable注解在spring3中的使用-实现缓存

    转:  http://blog.csdn.net/chenleixing/article/details/44815443 在软件开发中使用缓存已经有一个非常久的历史了.缓存是一种很好的设计思想,一旦 ...