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. (5)python tkinter-单选、多选

    单选按钮 tkinter.Radiobutton(root,text='a').pack() tkinter.Radiobutton(root,text='b').pack() tkinter.Rad ...

  2. python调用phantomjs组件(windows和linux)

    phantomjs在windows和linux系统,可以通selenium的webdriver直接调用,所以只要将phantomjs程序加载到python程序目录下. 示例代码如下所示: #建立Pha ...

  3. Topcoder SRM 144 DIV 1

    BinaryCode 模拟 题意是:定义串P,Q,其中Q[i]=P[i-1]+P[i]+P[i+1],边界取0,并且P必须是01串.现在给你Q,让你求出P. 做法是:枚举第一位是1还是0,然后就可以推 ...

  4. linux运维(重点)

    linux 添加系统变量: export log="log-all-$(date +%Y-%m-%d).php" export log="log-all-$(date + ...

  5. 批量去掉文件中的^M

    "^M"在Linux下的输入方法 ctrl v + ctrl m 方案一: find -type f | xargs sed -i 's/^M//g' 或者 find -name ...

  6. C# DBHelper类

    class DBHelper { //public static string connstr = "server=.;database=SuperKTV;uid=sa;pwd=123456 ...

  7. SFTP &amp; FTP Upload

    简述 >> FTP: 1. Install FTP service on Linux(Red Hat) as root user    [root]# yum install ftp 2. ...

  8. python logging模块学习(转)

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  9. 优化算法——拟牛顿法之L-BFGS算法

    一.BFGS算法 在"优化算法--拟牛顿法之BFGS算法"中,我们得到了BFGS算法的校正公式: 利用Sherman-Morrison公式可对上式进行变换,得到 令,则得到: 二. ...

  10. 怎样找出自己定义标签的java类

    怎样找出自己定义标签的java类 这是一个逆推的过程(建立自己定义标签能够查看下面连接:http://blog.csdn.net/antoniochan/article/details/3810990 ...