欢迎来真孝善网,为您提供真孝善正能量书籍故事!

构建基础网络架构:深入探讨网络连接关键技术

时间:11-07 现代故事 提交错误

很多朋友对于构建基础网络架构:深入探讨网络连接关键技术和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

/**

* 由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();

如果你还想了解更多这方面的信息,记得收藏关注本站。

用户评论

仰望幸福

真期待看到具体的实现代码!

    有6位网友表示赞同!

打个酱油卖个萌

学习一下网络框架的构建还是很不错的,尤其是在数据传输方面。

    有5位网友表示赞同!

拥抱

这个连接篇的内容是不是会涉及到socket之类的基础知识?

    有10位网友表示赞同!

百合的盛世恋

简单网络框架的实现感觉难度应该不太大吧?

    有7位网友表示赞同!

红尘烟雨

希望文章能详细介绍各个模块之间的衔接关系!

    有9位网友表示赞同!

灼痛

有没有想过用不同的协议来构建连接,例如HTTP或者WebSocket?

    有8位网友表示赞同!

£烟消云散

这个简化的网络框架可以用于学习网络编程的基本原理吗?

    有9位网友表示赞同!

鹿先森,教魔方

实现一个简单的网络框架,会不会很受未来开发中所利用的技术趋势影响呢?

    有10位网友表示赞同!

孤败

有没有想过将这个框架应用到一些实际的项目案例中?

    有5位网友表示赞同!

非想

我觉得连接篇应该包含不同操作系统下的网络编程实现比较。

    有17位网友表示赞同!

孤单*无名指

想了解一下如何处理不同类型的网络请求,比如GET和POST?

    有19位网友表示赞同!

封锁感觉

学习一个简单的网络框架可以帮助我们更好地理解更复杂的框架吗?

    有9位网友表示赞同!

为爱放弃

希望文章能详细讲解如何解决网络连接错误或异常情况!

    有13位网友表示赞同!

陌上花

这个框架能不能支持异步通信,提高性能呢?

    有5位网友表示赞同!

在哪跌倒こ就在哪躺下

我好奇一下这个框架的代码结构会如何设计?

    有12位网友表示赞同!

七级床震

会不会考虑到安全性呢?例如密码加密和认证机制?

    有14位网友表示赞同!

全网暗恋者

简单网络框架的实现需要哪些基础知识?可以分享一下学习资源吗?

    有13位网友表示赞同!

金橙橙。-

我觉得一个好的网络框架应该具有可扩展性和易维护性!

    有19位网友表示赞同!

君临臣

这个框架的目标用户群体是哪些人?开发者应该了解什么背景知识才能更好地理解?

    有15位网友表示赞同!

【构建基础网络架构:深入探讨网络连接关键技术】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活