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. UVA 10976 Fractions Again?!【暴力枚举/注意推导下/分子分母分开保存】

    [题意]:给你一个数k,求所有使得1/k = 1/x + 1/y成立的x≥y的整数对. [分析]:枚举所有在区间[k+1, 2k]上的 y 即可,当 1/k - 1/y 的结果分子为1即为一组解. [ ...

  2. Linux 安装 Java 运行环境

    方式一 # 简单粗暴流# 我使用的是 ubuntu server 18.04 LTS 版本的系统 不同的系统的命令可能存在差异# 在命令行使用java 回车 发现没有Java的话 下面会提示 安装的方 ...

  3. Eclipse4.4以上版本不能使用easyExplorer,采用OpenExplorer

    如果想在Ecipse里打开目录,一直用easyExplorer,可是现在版本升级了easyExplorer不好使,可以用OpenExplorer到https://github.com/samsonw/ ...

  4. 原生js获取元素的样式信息

    工作中经常会需要获取DOM元素的样式,之前都是通过jquery的css()方法,现在总结一下通过原生js获取元素样式的方法. obj.style js var _width = obj.style.w ...

  5. ArcObject开发,“异常在 ESRI.ArcGIS.Version.dll”错误

    “System.DllNotFoundException”类型的未经处理的异常在 ESRI.ArcGIS.Version.dll 中发生 其他信息: 无法加载 DLL“ArcGISVersion.dl ...

  6. Mac OS X上使用Wireshark抓包

    Wireshark针对UNIX Like系统的GUI发行版界面采用的是X Window(1987年更改X版本到X11).Mac OS X在Mountain Lion之后放弃X11,取而代之的是开源的X ...

  7. Context都没弄明白,还怎么做Android开发?

    Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言 ...

  8. python 单例模式应用

    class Singelton(object): __instance=None def __init__(self): pass def __new__(cls,*kwd,**kwargs): # ...

  9. EasyMvc入门教程-高级控件说明(18)弹出框控件

    前面两节介绍了信息框与对话框,实际开发中如果我们遇到更复杂的要求,比如要求在弹出框里显示另外的网址,如下所示: 实现代码如下: @Html.Q().Popup().Text("我可以嵌套网页 ...

  10. 海量数据插入数据库效率对照測试 ---ADO.NET下SqlBulkCopy()对照LINQ 下InsertAllOnSubmit()

    摘要:使用.NET相关技术向数据库中插入海量数据是经常使用操作.本文对照ADO.NET和LINQ两种技术.分别使用SqlBulkCopy()和InsertAllOnSubmit()方法进行操作. 得出 ...