很多朋友对于构建基础网络架构:深入探讨网络连接关键技术和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
/**
* 由lq于2017年5月14日创建。
* 该接口定义了实现请求的具体方法
*/
公共接口HttpStack {
//真正实现网络请求并返回数据的方法
公共响应执行请求(请求?请求);
}2. 使用HttpClientStack方式实现请求/**
* 由lq 于2017/5/14 创建。
*使用HttpClient执行api 9以下的网络请求
*/
公共类HttpClientStack 实现HttpStack {
//使用HttpClient进行网络请求的https配置
HttpClientConfig mConfig=HttpClientConfig.getConfig();
HttpClient mHttpClient=AndroidHttpClient.newInstance(mConfig.userAgent);
@覆盖
公共响应执行请求(请求?请求){
尝试{
HttpUriRequest httpUriRequest=createHttpRequest(请求);
//添加连接参数
setConnectionParams(httpUriRequest);
//添加标题
addHeaders(httpUriRequest,request.getHeaders());
//https配置
配置Https(请求);
//执行网络请求并返回结果
HttpResponse 响应=mHttpClient.execute(httpUriRequest);
//构建响应
响应rawResponse=new Response(response.getStatusLine());
//设置实体
rawResponse.setEntity(response.getEntity());
返回原始响应;
} catch (IOException e) {
e.printStackTrace();
}
返回空值;
}
//如果是https请求,则使用用户配置的SSLSocketFactory进行配置。
私有无效configHttps(请求?请求){
SSLSocketFactory sslSocketFactory=mConfig.getSslSocketFactory();
if (request.isHttps() sslSocketFactory !=null){
方案方案=新方案("https",(SocketFactory)sslSocketFactory,443);
mHttpClient.getConnectionManager().getSchemeRegistry().register(scheme);
}
}
//设置连接参数
私有无效setConnectionParams(HttpUriRequest httpUriRequest){
HttpParams httpParams=httpUriRequest.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams,mConfig.ConnTimeOut);
HttpConnectionParams.setSoTimeout(httpParams,mConfig.soTimeOut);
}
//根据类型创建不同的请求类型
静态HttpUriRequest createHttpRequest(请求?请求){
HttpUriRequest httpUriRequest=null;
开关(request.getHttpMethod()){
案例GET:
httpUriRequest=new HttpGet(request.getUrl());
休息;
案例DELETE:
httpUriRequest=new HttpDelete(request.getUrl());
休息;
案例POST:
httpUriRequest=new HttpPost(request.getUrl());
休息;
案例PUT:
httpUriRequest=new HttpPut(request.getUrl());
休息;
默认:
throw new IllegalStateException("未知的请求方法。");
}
返回httpUriRequest;
}
//添加请求头
私有静态无效addHeaders(HttpUriRequest请求,Mapheaders){
for (字符串键: headers.keySet()){
request.setHeader(key,headers.get(key));
}
}
//将请求参数设置到HttpEntity中
私有静态无效setEntityNonEmptyBody(HttpEntityEnendingRequestBase httpRequest,
请求?请求){
byte[] body=request.getBody();
如果(主体!=空){
HttpEntity 实体=new ByteArrayEntity(body);
httpRequest.setEntity(实体);
}
}
}3. 使用HttpUrlConnStack方式实现请求/**
* 由lq 于2017/5/14 创建。
* HttpStack使用HttpURLConnection执行网络请求
*/
公共类HttpUrlConnStack 实现HttpStack {
//配置https
HttpUrlConnConfig mConfig=HttpUrlConnConfig.getConfig();
@覆盖
公共响应执行请求(请求?请求){
HttpURLConnection 连接=null;
尝试{
//构建HttpURLConnection
连接=createUrlConnection(request.getUrl());
//设置标题
setRequestHeaders(连接,请求);
//设置Body参数
setRequestParams(连接,请求);
//https配置
配置Https(请求);
//获取结果
返回fetchResponse(连接);
} catch (IOException e) {
e.printStackTrace();
} 最后{
如果(连接!=空){
连接.断开();
}
}
返回空值;
}
//建立连接
私有HttpURLConnection createUrlConnection(String url) 抛出IOException {
URL newUrl=新URL(url);
URLConnection urlConnection=newUrl.openConnection();
urlConnection.setConnectTimeout(mConfig.ConnTimeOut);
urlConnection.setReadTimeout(mConfig.soTimeOut);
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
返回(HttpURLConnection) urlConnection;
}
私有无效configHttps(请求?请求){
如果(request.isHttps()){
SSLSocketFactory sslFactory=mConfig.getSslSocketFactory();
如果(sslFactory!=null){
HttpsURLConnection.setDefaultSSLSocketFactory(sslFactory);
HttpsURLConnection.setDefaultHostnameVerifier(mConfig.getHostnameVerifier());
}
}
}
私有无效setRequestHeaders(HttpURLConnection连接,请求?请求){
SetheaderKeys=request.getHeaders().keySet();
for (String headerName : headerKeys){
连接.addRequestProperty(headerName,request.getHeaders().get(headerName));
}
}
//将数据写入请求,用于POST和PUT方法
protected void setRequestParams(HttpURLConnection 连接, Request?request) 抛出IOException {
Request.HttpMethod 方法=request.getHttpMethod();
连接.setRequestMethod(method.toString());
byte[] body=request.getBody();
如果(主体!=空){
连接.setDoOutput(true);
连接.addRequestProperty(Request.HEADER_CONTENT_TYPE,request.getBodyContentType());
DataOutputStream dataOutputStream=new DataOutputStream(connection.getOutputStream());
dataOutputStream.write(body);
dataOutputStream.close();
}
}
//解析响应并构建自定义响应
私有响应fetchResponse(HttpURLConnection 连接) 抛出IOException {
ProtocolVersion 协议版本=new ProtocolVersion("HTTP",1,1);
int responseCode=连接.getResponseCode();
if (响应代码==-1){
throw new IOException("无法重试HttpUrlConnection 的响应代码");
}
//状态行数据
StatusLine responseStatus=new BasicStatusLine(protocolVersion, connection.getResponseCode(),
连接.getResponseMessage());
//构建响应
响应响应=new Response(responseStatus);
//设置响应数据
response.setEntity(entityFromURLConnection(连接));
addHeadersToResponse(响应,连接);
返回响应;
}
//执行HTTP请求后,获取其数据流,即返回请求结果的实体对象。
私有HttpEntity实体FromURLConnection(HttpURLConnection连接){
BasicHttpEntity 实体=new BasicHttpEntity();
输入流=null;
尝试{
is=连接.getInputStream();
} catch (IOException e) {
e.printStackTrace();
is=连接.getErrorStream();
}
实体.setContent(是);
实体.setContentLength(connection.getContentLength());
实体.setContentEncoding(connection.getContentEncoding());
实体.setContentType(connection.getContentType());
返回实体;
}
//将连接的请求标头添加到响应中
私人无效addHeadersToResponse(BasicHttpResponse响应,HttpURLConnection连接){
for (Map.Entryheader : connection.getHeaderFields().entrySet()){
if (header.getKey() !=null){
标头h=new BasicHeader(header.getKey(),header.getValue().get(0));
响应.addHeader(h);
}
}
}
}4. 根据SDK选择不同的请求方式/**
* 由lq 于2017/5/14 创建。
* 根据api版本选择HttpClient或HttpURLConnection。
*/
公共类HttpStackFactory {
私有静态最终int GINGERBREAD_SDK_NUM=9;
公共静态HttpStack createHttpStack(){
intruntimeSDKApi=Build.VERSION.SDK_INT;
如果(运行时SDKApi=GINGERBREAD_SDK_NUM){
返回新的HttpUrlConnStack();
}
返回新的HttpClientStack();
如果你还想了解更多这方面的信息,记得收藏关注本站。
【构建基础网络架构:深入探讨网络连接关键技术】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
真期待看到具体的实现代码!
有6位网友表示赞同!
学习一下网络框架的构建还是很不错的,尤其是在数据传输方面。
有5位网友表示赞同!
这个连接篇的内容是不是会涉及到socket之类的基础知识?
有10位网友表示赞同!
简单网络框架的实现感觉难度应该不太大吧?
有7位网友表示赞同!
希望文章能详细介绍各个模块之间的衔接关系!
有9位网友表示赞同!
有没有想过用不同的协议来构建连接,例如HTTP或者WebSocket?
有8位网友表示赞同!
这个简化的网络框架可以用于学习网络编程的基本原理吗?
有9位网友表示赞同!
实现一个简单的网络框架,会不会很受未来开发中所利用的技术趋势影响呢?
有10位网友表示赞同!
有没有想过将这个框架应用到一些实际的项目案例中?
有5位网友表示赞同!
我觉得连接篇应该包含不同操作系统下的网络编程实现比较。
有17位网友表示赞同!
想了解一下如何处理不同类型的网络请求,比如GET和POST?
有19位网友表示赞同!
学习一个简单的网络框架可以帮助我们更好地理解更复杂的框架吗?
有9位网友表示赞同!
希望文章能详细讲解如何解决网络连接错误或异常情况!
有13位网友表示赞同!
这个框架能不能支持异步通信,提高性能呢?
有5位网友表示赞同!
我好奇一下这个框架的代码结构会如何设计?
有12位网友表示赞同!
会不会考虑到安全性呢?例如密码加密和认证机制?
有14位网友表示赞同!
简单网络框架的实现需要哪些基础知识?可以分享一下学习资源吗?
有13位网友表示赞同!
我觉得一个好的网络框架应该具有可扩展性和易维护性!
有19位网友表示赞同!
这个框架的目标用户群体是哪些人?开发者应该了解什么背景知识才能更好地理解?
有15位网友表示赞同!