package com.ztspeech.simutalk2.net; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import org.apache.http.HttpStatus; import cn.ac.ia.directtrans.json.DefineType; import com.ztspeech.recognizer.PhoneInfo; import com.ztspeech.recognizer.net.NetCheck; import com.ztspeech.simutalk2.dictionary.util.LogInfo; public class HttpPostData implements Runnable { private static boolean mIsSendPhoneInfo = false; private PostPackage mPackage = null; private String host = ""; private String httpParam = ""; private String httpUrl = ""; private static String _Cookie = ""; private static Object _synch = new Object(); public int connectTimeout = NetDefine.HTTP_CONNECT_TIMEOUT; public int readTimeout = NetDefine.HTTP_READ_TIMEOUT; private void updateUrl() { // httpUrl = "http://" + host + "/clientmsgservlet?" + httpParam; httpUrl = "http://" + host + "/DirectTrans/clientmsgservlet?" + httpParam; //httpUrl = "http://" + host + "/TransApp_test/clientmsgservlet?" + httpParam; } private String getCookie() { synchronized (_synch) { return _Cookie; } } private void setCookie(String cookie) { synchronized (_synch) { _Cookie = cookie; } } public void setParam(String param) { httpParam = param; } public void setHost(String sHost) { host = sHost; updateUrl(); } private String getPostUrl() { String sRet = httpUrl; if (mIsSendPhoneInfo == false) { mIsSendPhoneInfo = true; if (NetCheck.isWifiActive()) sRet += "&nt=wifi"; else sRet += "&nt=" + PhoneInfo.simOperatorName; } return sRet; } private void writeLog(String sLog) { LogInfo.LogOut("trans", "post " + sLog); } public int postData() { int nRet = NetResultFlag.POST_DATA_ERROR; HttpURLConnection httpConn = null; try { URL url = new URL(getPostUrl()); httpConn = (HttpURLConnection) url.openConnection(); if (httpConn == null) { return nRet; } ByteArrayOutputStream data = mPackage.getStream(); // ������������ httpConn.setConnectTimeout(connectTimeout); httpConn.setReadTimeout(readTimeout); httpConn.setDoOutput(true); // ʹ�� URL ���ӽ������ httpConn.setDoInput(true); // ʹ�� URL ���ӽ������� httpConn.setUseCaches(false); // ���Ի��� httpConn.setRequestMethod("POST"); httpConn.setRequestProperty("Content-Type", "text/json"); httpConn.setRequestProperty(DefineType.POST_CMD, mPackage.cmd); httpConn.setRequestProperty(DefineType.POST_TYPE, mPackage.type); httpConn.setRequestProperty("Connection", "Keep-Alive");// ά�ֳ����� // mHttpConn.setRequestProperty("Content-length", "" + count); httpConn.setRequestProperty("Charset", "UTF-8"); httpConn.setRequestProperty("Cookie", getCookie()); httpConn.connect(); if (data != null) { writeLog("post data size=" + data.size()); httpConn.getOutputStream().write(data.toByteArray()); httpConn.getOutputStream().flush(); } nRet = httpConn.getResponseCode(); if (nRet == HttpStatus.SC_OK) { String key = ""; String cookie = ""; for (int i = 1; (key = httpConn.getHeaderFieldKey(i)) != null; i++) { if (key.equalsIgnoreCase("set-cookie")) { cookie = httpConn.getHeaderField(key); cookie = cookie.substring(0, cookie.indexOf(";")); } else if (key.equalsIgnoreCase(DefineType.POST_TYPE)) { mPackage.type = httpConn.getHeaderField(key); } } if (cookie.length() > 10) { setCookie(cookie); } InputStream is = httpConn.getInputStream(); if (is == null) { throw new IOException("postData.getInputStream == null"); } ByteArrayOutputStream out = new ByteArrayOutputStream(); int BUFFER_SIZE = 1024; byte[] buf = new byte[BUFFER_SIZE]; int nRead = 0; while (true) { nRead = is.read(buf, 0, BUFFER_SIZE); if (nRead == -1) { break; } if (nRead > 0) { out.write(buf, 0, nRead); } } mPackage.doNetResult(out); is.close(); out.close(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } if (nRet != HttpStatus.SC_OK) { mPackage.doNetError(nRet); } if (httpConn != null) { httpConn.disconnect(); httpConn = null; } return nRet; } /** * �����߳��ύ * * @param pack * @return */ public boolean post(PostPackage pack) { synchronized (this) { mPackage = pack; } if (NetCheck.isNetActive()) { postData(); return true; } else { mPackage.doNetError(NetResultFlag.POST_CONNECT_ERROR); } return false; } /** * ���߳��ύ * * @param pack * @return */ public boolean threadPost(PostPackage pack) { synchronized (this) { mPackage = pack; } if (NetCheck.isNetActive()) { Thread t = new Thread(this); t.start(); return true; } else { mPackage.doNetError(NetResultFlag.POST_CONNECT_ERROR); } return false; } public void run() { postData(); } }