很久以前就想写一篇关于网络编程的东西,但是想来想去,网络编程在应用开发上自己也没做过什么深入的研究,写出来的东西都比较简单,那就写写自己到底了解多少吧,以后再慢慢补充。
我所说的网络编程是基于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.
关于文件上传的(MIME)content-type给大家推荐一篇博文: http://blog.csdn.net/cxm_hwj/article/details/6690058
另外说一点哈,这是上传协议,什么是协议简单的说就是你我协商好的方式,自己的服务器给自己客户端提供服务,那么自己是知道如何解析内容的,那就不用定义那么多规矩来遵循了,但这就会照成和互联网上大家的标准不一样的,不兼容的情况就会出现。
下载
断点续传
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 安全问题