协议处理:
协议处理包括协议分析和协议封装。
协议分析:发送协议、接收协议。
协议封装:节点对象化、节点序列化、请求接口(抽象)化、协议通用化。
协议格式:xml、json。xml可以压缩,压缩后比json还小。
协议压缩:wbxml、大量数据压缩。
常量放到接口中。
通信工具:
实现方式:
1).使用HttpURLConnection(稳定性差。早期用的比较多,现在基本不用)
2).使用HttpClient
3).使用Socket通信(豌豆荚(USB、WIFI)、聊天工具)
通信渠道:
1).WLAN(WiFi)
2).手机APN(Access Point Names)接入点(基站)
①WAP方式(地域性、增值业务——IP是10.0.0.172(200)端口是80)
②net方式
其中WAP方式需要先连接到通信运营商(代理),运营商会过滤一些增值业务的请求,所以访问会慢一点,而net方式可以直接访问互联网上的资源。移动、联通的代理IP是10.0.0.172,电信的是10.0.0.200.
处理步骤:
1.判断网络类型,当为手机(WAP方式)上网时注意代理信息获取。
①判断当前是否可以联网:通过判断WiFi和mobile两种方式是否能够连接网路:
利用ConnectivityManager获取对应类型的NetworkInfo来判断当前网路情况,其中ConnectivityManager.TYPE_WIFI代表WiFi、ConnectivityManager.TYPE_MOBILE代表手机。
需要添加权限:ACCESS_NETWORK_STATE
private static boolean isWIFIConnection(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if(networkInfo != null){
return networkInfo.isConnected();
}
return false;
}
②当确定为手机联网方式时,先读取被选中的APN,再 获取其代理参数 ,如果是net方式,其代理信息为空。
在两个类之间传递数据,需要定义一个类,在类中定义静态的要传递的参数。如:
public class GlobalParams {
public static String PROXY = "";
public static int PORT = 0;
}
Uri uri = Uri.parse("content://telephony/carriers/preferapn");
if(isMOBILE){
ContentResolver resolver = context.getContentResolver();
Uri uri = Uri.parse("content://telephony/carriers/preferapn");
Cursor cursor = resolver.query(uri, null, null, null, null);
if(cursor != null &&cursor.moveToNext()){
GlobalParams.PROXY = cursor.getString(cursor.getColumnIndex("proxy"));
GlobalParams.PORT = cursor.getInt(cursor.getColumnIndex("port"));
}
}
2.使用HttpClient编写代码,加强稳定性。
public class HttpClientUtil {
private HttpClient client;
private HttpPost post;
public HttpClientUtil(){
client = new DefaultHttpClient();
// 判断是否需要设置代理信息
if(StringUtils.isNotBlank(GlobalParams.PROXY)){
// 设置代理信息
HttpHost host = new HttpHost(GlobalParams.PROXY, GlobalParams.PORT);
client.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, host);
}
}
/**
* 向指定的链接发送xml文件
* @param uri
* @param xml
* @return
*/
public InputStream sendXml(String uri, String xml){
post = new HttpPost(uri);
try {
StringEntity entity = new StringEntity(xml, ConstantValue.ENCODING);
// 设置参数
post.setEntity(entity);
// 执行POST方法
HttpResponse response = client.execute(post);
if(response.getStatusLine().getStatusCode() == 200){
// 获得响应的结果
return response.getEntity().getContent();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}