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. TIOBE排行榜

    作者:码思客链接:https://zhuanlan.zhihu.com/p/37513668来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1 JAVA 毫无疑问的业界 ...

  2. What are Windows ACLs and why are they important?

    An access control list (ACL), with respect to a computer file system, is a list of permissions attac ...

  3. SecureCRT设置超级终端

    SecureCRT可以代替Windows中的超级终端,用来连接网络设备的Console口新建连接Serial串口,配置为:Bits per second: 9600Data bits: 8Parity ...

  4. Mogodb集群搭建

    1.上传解压软件包 cd /home/dinpay/ 解压:tar -zxvf  mongodb-linux-x86_64-rhel62-3.2.2.tgz 重命名:  mv  mongodb-lin ...

  5. 2017.2.15 开涛shiro教程-第二十一章-授予身份与切换身份(二) controller

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 开涛shiro教程-第二十一章-授予身份与切换身份(二) 1.回顾 ...

  6. 【LeetCode】Validate Binary Search Tree ——合法二叉树

    [题目] Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defin ...

  7. InnoDB Insert(插入)操作(下)--mysql技术内幕

    接上一篇文章,最后做的那个实验,我是想证明mysql innodb存储引擎,commit操作与flush数据到磁盘之间的关系,当与同事交流之后,他说,你应该把innodb_buffer_size的大小 ...

  8. 入门--JTBC系统学习(1)

    下载代码 JTBC有还例如以下几类 JDK(1.6)+JSP(2.0)+MYSQL/SQLITE ASP.NET(2.0)+ACCESS/SQL SERVER PHP+MYSQL ASP(3.0)+A ...

  9. JSF教程(8)——生命周期之Apply Request Values Phase

    当一个组件树在一个postbacks请求中被恢复之后其中每一个组件从request的參数中取得各自的值,这里使用的是processDecodes方法. 这个值会保存在本地的每一个组件中,在源代码中此过 ...

  10. 重装系统后恢复wubi安装的Ubuntu(未实测)

     wubi安装成功,但是后来windows系统重装了,如何修复ubuntu系统的引导?[另外完全可以复制别人的wubi安装的ubuntu,但是要放在同一个盘符下]  将X:/ubuntu/winboo ...