关于网络编程知识的了解应用

很久以前就想写一篇关于网络编程的东西,但是想来想去,网络编程在应用开发上自己也没做过什么深入的研究,写出来的东西都比较简单,那就写写自己到底了解多少吧,以后再慢慢补充。


我所说的网络编程是基于TCP/IP协议的网络编程,更具体一点是HTTP协议的编程,基于Socket的编程。TCP/IP协议是一种面向连接的协议,简单的说是通信双方在交换数据的之前要先建立连接,这就有了3次握手,连接断开的时候4次握手,由于是面向连接的,所以现在应用客户端向服务器主动请求数据好做,但是服务器主动给客户端不好做,就是所谓的推送,以为客户端很多,服务器地址很少。

HTTP协议是基于TCP协议再往上一层的应用协议,所以做了很多处理了,在编程的时候我们更关注的是在这种协议下的一些参数配置和设计。

数据结构

1.HTTP请求

转载这哥们儿写的不错:http://blog.csdn.net/kfanning/article/details/6062118/
http://blog.csdn.net/hudashi/article/details/6931885

<请求行>
<请求头>
<空行>
[数据块]

例如:

GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
<空行>
【数据块】


POST / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
<空行>
name=hd%20Ajax&publisher=Wiley


  • 问题:我们常用的请求有GET和POST方式,这两者区别在什么地方?
  • 解答:GET请求会将请求参数放在请求行里面,例如:GET /hd/?name=hd%20 HTTP/1.1,里面的信息是经过编码的;
  • 那么POST方式请求是放在数据块中的。

2.HTTP响应

<状态行>
<响应头>
<空行>
【数据块】

例如:
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<空行>
数据数据数据

功能应用:
1. 上传(Http Ftp)


  • 分片上传

    呵呵,理论很简单,小文件还行,大文件实现比较难搞。

HTTP上传必然使用POST方式啦,那么协议规定的上传文件格式是什么样的呢,上来看一下例子:


<请求行>
<请求头>
<空行>

<分隔符>
<字段内容>
<分隔符号 >
<字段内容2 >


<请求行>

POST /myupload/uploadDo HTTP/1.1

<请求头>
Host: localhost:8820
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:8820/myupload/index.jsp
Cookie: JSESSIONID=D86CEA4F6F230AFBBDAAE54D724F73D0
Content-Type: multipart/form-data; boundary=O(∩_∩)O
Content-Length: 655

<空行>

<消息体>

–O(∩_∩)O
Content-Disposition: form-data; name=”myfile”; filename=”tt.txt”
Content-Type: text/plain

11111111111
222
333333333
1111111
3333333
5444444444
–O(∩_∩)O
Content-Disposition: form-data; name=”myImg”; filename=”1.txt”
Content-Type: text/plain

adaaaaaaaaaaa
sbbbbbbbbbbbbbbbb
dddddddddd
daaaaaaaaa
eeeeeeeeee

–O(∩_∩)O–


好让我们来解析一下上面这个协议的格式

a.Content-Type: multipart/form-data; boundary=O(∩_∩)O
multipart/form-data:不对数据进行URL编码;
boundary=O(∩_∩)O:定义分隔符,用于数据间的分隔,方便我们服务端解析
注意:分隔符是这么定义的 开始分隔符为 –boundary;结束分隔符 –boundary–;

b.关于HTTP上传,我想做邮件客户端的同学应该要了解的更多一点。

c.这就是Android开源AsyncHttpClient的文件上传参数封装过程

关于文件上传的(MIME)content-type给大家推荐一篇博文: http://blog.csdn.net/cxm_hwj/article/details/6690058
另外说一点哈,这是上传协议,什么是协议简单的说就是你我协商好的方式,自己的服务器给自己客户端提供服务,那么自己是知道如何解析内容的,那就不用定义那么多规矩来遵循了,但这就会照成和互联网上大家的标准不一样的,不兼容的情况就会出现。

  1. 下载

    断点续传
    Http协议实现断点续传主要靠range/content-range来控制,一般通信双方肯定要相互支持才可以啦

下面是引用:
请求下载整个文件:


GET /test.rar HTTP/1.1
Connection: close
Host: 116.1.219.219
Range: bytes=0-100


Range头域可以请求实体的一个或者多个子范围,Range的值为0表示第一个字节,也就是Range计算字节数是从0开始的
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999

一般正常回应


HTTP/1.1 206 OK
Content-Length: 801
Content-Type: application/octet-stream
Content-Location: http://www.onlinedown.net/hj_index.htm
Content-Range: bytes 0-100/2350 //2350:文件总大小
Last-Modified: Mon, 16 Feb 2009 16:10:12 GMT
Accept-Ranges: bytes
ETag: “d67a4bc5190c91:512”
Server: Microsoft-IIS/6.0
Date: Wed, 18 Feb 2009 07:55:26 GMT


注意:如果用户的请求中含有range ,则服务器的相应代码为206。
206 - Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。

技术点:
1. 缓存
2. 连接池
3. Cookie
4. GZIP压缩
5. HTTPS 安全问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值