本项目通过httpClient进行客户端和服务器的网络连接,我稍稍的将客户端发送请求部分的网络总结了一下。
具体情况如上图。
注意:
1、各种请求在这里代表登录请求,任务请求等等url地址。
可以看出,整个网络部分, 最为关键的便为serverUtil和httpUtil两块,这两块的具体代码如下:
serverUtil:
- /**
- *网络通信核心类
- *@authorguxuede
- *
- */
- publicclassServerUtil{
- privatestaticStringhosturl/*="http://192.168.1.56:8080/CRMServer"*/;
- privatestaticDefaultHttpClienthttpClient;
- privatestaticintConnectionTimeout=5;//连接超时
- privatestaticintReadTimeOut=5;//读超时
- /**
- *初始化IpPort
- *@paramip
- *@paramport
- */
- publicstaticvoidinitIpPort(Stringip,Stringport){
- hosturl="http://"+ip+":"+port+"/CRMServer";
- ClientServiceFactory.initUri();
- }
- /**
- *初始化httpClient
- */
- publicstaticvoidinitHttpClient(){
- HttpParamsparams=newBasicHttpParams();
- HttpProtocolParams.setContentCharset(params,"utf-8");
- HttpProtocolParams.setHttpElementCharset(params,"utf-8");
- HttpProtocolParams.setVersion(params,HttpVersion.HTTP_1_1);
- HttpProtocolParams.setUserAgent(params,"HttpComponents/1.1");
- HttpConnectionParams.setConnectionTimeout(params,ConnectionTimeout*1000);
- HttpConnectionParams.setSoTimeout(params,ReadTimeOut*1000);
- SchemeRegistryschemeRegistry=newSchemeRegistry();
- schemeRegistry.register(newScheme("http",PlainSocketFactory.getSocketFactory(),80));
- schemeRegistry.register(newScheme("https",SSLSocketFactory.getSocketFactory(),443));
- ClientConnectionManagerconnectionManager=newThreadSafeClientConnManager(params,schemeRegistry);
- httpClient=newDefaultHttpClient(connectionManager,params);
- }
- publicstaticHttpClientgetHttpClient(){
- returnhttpClient;
- }
- publicstaticStringgetHosturl(){
- returnhosturl;
- }
- }
HttpUtil:
- publicclassHttpUtil{
- privatestaticfinalStringTAG=ActivityUtil.getTag(HttpUtil.class);
- /**
- *该方法可以将一个对象中所有属性和他们的值转换成键值对。
- *以属性名为Key,属性的值为Value,存放入NameValuePair中。
- *值为null的将不转换,且一个类中第一个属性不转换(因为考虑到很多类继承了Serializable,不想将serialVersionUID也无聊的转换进去);
- *所以规定:要转换的类必须实现Serializable且设置serialVersionUID在类属性中第一个位置。
- *参数l。指的是要向上递归几个父类。
- *l=1:只转换自己
- *l=2:转换自己和父类。
- *@paramobj要转换的对象
- *@paramll=1:只转换自己l=2:转换自己和父类。以此类推
- */
- publicstaticvoidObjectToNameValuePairs(Serializableobj,intl,List<NameValuePair>params){
- if(obj==null)
- return;
- Class<?>clss=obj.getClass();
- for(inti=0;i<l;i++){
- if(i>0){
- clss=(Class<?>)clss.getGenericSuperclass();
- }
- Field[]fields=clss.getDeclaredFields();
- if(fields.length<2){
- continue;
- }
- for(intj=1;j<fields.length;j++){
- fields[j].setAccessible(true);
- Objecto=null;
- try{
- o=fields[j].get(obj);
- }catch(IllegalArgumentExceptione1){
- Log.w(TAG,e1);
- }catch(IllegalAccessExceptione2){
- Log.w(TAG,e2);
- }
- if(o!=null){
- params.add(newBasicNameValuePair(fields[j].getName(),o.toString()));
- }
- fields[j].setAccessible(false);
- }
- }
- }
- /**
- *向指定的uri发送post方法。将返回的信息转换成对象。
- *抛出的InteractionException异常有以下种情况
- *msg_res_id=1Requestrefused
- *msg_res_id=2Requesttimeout
- *msg_res_id=3Repliescannotberesolved
- *msg_res_id=100>http访问服务端异常
- *msg_res_id=1001没有登录或session失效
- *msg_res_id=1002参数不正确导致服务端异常(sql异常,空指针)
- *@paramurihosturi
- *@paramparams附加参数
- *@return转换的object
- *@throwsInteractionException
- */
- publicstaticObjectexecutePost(Stringuri,List<NameValuePair>params)throwsInteractionException{
- HttpClienthttpclinet=ServerUtil.getHttpClient();
- HttpPostpost=newHttpPost(uri);
- try{
- if(params!=null){
- post.setEntity(newUrlEncodedFormEntity(params,HTTP.UTF_8));
- }
- }catch(UnsupportedEncodingExceptione1){
- Log.w(TAG,e1);
- }
- HttpResponseres=null;
- try{
- Longstart=System.currentTimeMillis();
- Log.v("Post","Start:[URI:"+uri+"][Params:"+params+"]");
- res=httpclinet.execute(post);
- Log.v("Post","Over:[URI:"+uri+"][CostTime:"+(System.currentTimeMillis()-start)+"]");
- }catch(Exceptione){
- Log.w(TAG,e);
- //极有可能会超时
- if(einstanceofHttpHostConnectException){
- thrownewInteractionException("Requestrefused",e,1);
- }else{
- thrownewInteractionException("Requesttimeout",e,2);
- }
- }
- if(res.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
- Headerheadercode=res.getFirstHeader("ResultCode");
- if(headercode!=null&&headercode.getValue()!=null){
- intmResultCode=Integer.parseInt(headercode.getValue());
- Headerreason=res.getFirstHeader("Reason");
- if(reason!=null&&reason.getValue()!=null){
- //从返回头中获取服务端主动抛出的异常。如没有登录参数不正确等异常
- thrownewInteractionException(reason.getValue(),mResultCode);
- }
- }
- ObjectInputStreamois=null;
- try{
- ois=newObjectInputStream(res.getEntity().getContent());
- Objectobj=ois.readObject();
- returnobj;
- }catch(Exceptione){
- Log.w(TAG,e);
- //服务端返回了令人难以理解的内容
- thrownewInteractionException("Repliescannotberesolved",e,3);
- }finally{
- if(ois!=null)
- try{
- ois.close();
- }catch(IOExceptione){
- Log.w(TAG,e);
- }
- }
- }else{
- //服务端发生异常
- thrownewInteractionException("Requestfailure,Serverexception",res.getStatusLine().getStatusCode());
- }
- }
- }
未完待续。。。