您的位置:首页 > 理论基础 > 计算机网络

Android项目技术总结:网络连接总结

2012-02-28 17:18 483 查看
本项目通过httpClient进行客户端和服务器的网络连接,我稍稍的将客户端发送请求部分的网络总结了一下。



具体情况如上图。

注意:

1、各种请求在这里代表登录请求,任务请求等等url地址。

可以看出,整个网络部分, 最为关键的便为serverUtil和httpUtil两块,这两块的具体代码如下:

serverUtil:

/**
*  网络通信核心类
* @author guxuede
*
*/
public class ServerUtil {
private static  String hosturl /*= "http://192.168.1.56:8080/CRMServer"*/;
private static  DefaultHttpClient httpClient;
private static int ConnectionTimeout = 5;// 连接超时
private static int ReadTimeOut = 5;// 读超时

/**
* 初始化IpPort
* @param ip
* @param port
*/
public static void initIpPort(String ip,String port){
hosturl="http://"+ip+":"+port+"/CRMServer";
ClientServiceFactory.initUri();
}
/**
* 初始化httpClient
*/
public static void initHttpClient(){
HttpParams params = new BasicHttpParams();
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);

SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params,schemeRegistry);

httpClient = new DefaultHttpClient(connectionManager, params);

}

public static HttpClient getHttpClient() {
return httpClient;
}

public static String getHosturl() {
return hosturl;
}
}


HttpUtil:

public class HttpUtil {
private static final String TAG=ActivityUtil.getTag(HttpUtil.class);

/**
* 该方法可以将一个对象中所有属性和他们的值转换成键值对。
* 以属性名为Key,属性的值为Value,存放入NameValuePair中。
* 值为null的将不转换,且一个类中第一个属性不转换(因为考虑到很多类继承了Serializable,不想将serialVersionUID也无聊的转换进去);
* 所以规定:要转换的类必须实现Serializable且设置serialVersionUID在类属性中第一个位置。
* 参数l。指的是要向上递归几个父类。
* l=1:只转换自己
* l=2:转换自己和父类。
* @param obj 要转换的对象
* @param l	  l=1:只转换自己  l=2:转换自己和父类。以此类推
*/
public static void ObjectToNameValuePairs(Serializable obj,int l,List<NameValuePair> params){
if(obj==null)
return;
Class<?> clss=obj.getClass();
for(int i=0;i<l;i++){
if(i > 0){
clss=(Class<?>) clss.getGenericSuperclass();
}
Field[] fields=clss.getDeclaredFields();
if(fields.length < 2){
continue ;
}
for(int j=1;j < fields.length;j++){
fields[j].setAccessible(true);
Object o=null;
try {
o = fields[j].get(obj);
} catch (IllegalArgumentException e1) {
Log.w(TAG, e1);
} catch (IllegalAccessException e2) {
Log.w(TAG, e2);
}
if(o!=null){
params.add(new BasicNameValuePair(fields[j].getName(),o.toString()));
}
fields[j].setAccessible(false);
}
}
}

/**
* 向指定的uri发送post方法。将返回的信息转换成对象。
* 抛出的InteractionException异常有以下种情况
* msg_res_id=1  Request refused
* msg_res_id=2	Request timeout
* msg_res_id=3	Replies can not be resolved
* msg_res_id=100> http访问服务端异常
* msg_res_id=1001 没有登录或session失效
* msg_res_id=1002 参数不正确导致服务端异常(sql异常,空指针)
* @param uri			hosturi
* @param params		附加参数
* @return				转换的object
* @throws InteractionException
*/
public static Object executePost(String uri,List<NameValuePair> params) throws InteractionException{
HttpClient httpclinet=ServerUtil.getHttpClient();
HttpPost post=new HttpPost(uri);
try {
if(params!=null){
post.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
}
} catch (UnsupportedEncodingException e1) {
Log.w(TAG, e1);
}
HttpResponse res=null;
try {
Long start=System.currentTimeMillis();
Log.v("Post", "Start:[URI:"+uri+"] [Params:"+params+"]");
res = httpclinet.execute(post);
Log.v("Post", "Over:[URI:"+uri+"] [Cost Time:"+(System.currentTimeMillis()-start)+"]");
} catch (Exception e) {
Log.w(TAG, e);
//极有可能会超时
if(e instanceof HttpHostConnectException){
throw new InteractionException("Request refused", e ,1);
}else{
throw new InteractionException("Request timeout", e ,2);
}
}

if(res.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
Header headercode=res.getFirstHeader("ResultCode");
if(headercode!=null && headercode.getValue()!=null){
int mResultCode=Integer.parseInt(headercode.getValue());
Header reason=res.getFirstHeader("Reason");
if(reason!=null && reason.getValue()!=null){
//从返回头中获取服务端主动抛出的异常。如没有登录 参数不正确等异常
throw new InteractionException( reason.getValue() , mResultCode);
}
}
ObjectInputStream ois=null;
try {
ois = new ObjectInputStream(res.getEntity().getContent());
Object obj = ois.readObject();
return obj;
} catch (Exception e) {
Log.w(TAG, e);
//服务端返回了令人难以理解的内容
throw new InteractionException("Replies can not be resolved", e ,3);
}finally{
if(ois!=null)
try {
ois.close();
} catch (IOException e) {
Log.w(TAG, e);
}
}
}else{
//服务端发生异常
throw new InteractionException("Request failure,Server exception",res.getStatusLine().getStatusCode());
}
}
}


未完待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: