网络编程(一)基础知识

版权声明:本文为博主原创文章,欢迎转载,转载请注明原文地址、作者信息。 https://blog.csdn.net/hjimce/article/details/79506793

1.1 Tcp数据发送

从机器A发给机器B

数据发送是分解成很多信息包,到机器B后,机器B会重新合成在一起;在发送过程中,要求接收方没接收到一个包,需要反馈信息,如果没有反馈,tcp会自动重新发送,一直尝试目的是为了防止某个包缺失,导致整个数据损坏;每个包都会有个序号,这样确保B端,收到所有的包后,能够重组数据。

1.2 IP地址与端口

要给B发送数据,首先要知道B电脑的地址,其次由于B电脑可能有很多个程序,比如:qq、邮件、浏览器等,你具体是要发送给哪个程序;所以有了端口这个概念,一个程序对应一个端口,端口取值范围一般是:1024~65535

1.3 内网与外网

有的时候我们在学校、公司,要用公司的电脑搭建一个服务器,然后外网客户端可以使用;那么这个时候服务器的ip地址、端口要怎么设置:需要在路由器上设置把某一端口映射到B上,由A来连接路由器的这个端口。

1.4 DNS

DNS是一个分布式数据库,超级庞大;每条记录包含了:(域名,ip地址)

1.5 浏览器

浏览器的主要功能就是向服务器发出请求,在浏览器窗口中展示想要访问的网络资源。这里资源一般是指 HTML 文档,图片等其他的类型。资源的位置由用户使用 URL(统一资源标示符)指定。

而浏览器的核心——渲染引擎便是负责显示请求的内容。如果请求的内容是 HTML,它就负责解析 HTML 和 CSS 内容,并将解析后的内容显示在屏幕上。

工作流程:

 1. 输入URL地址或者点击URL的一个链接

 2. 浏览器根据URL地址,结合DNS,解析出URL对应的IP地址

   1)浏览器通过发送一个TCP的包,要求服务器打开连接

   2)服务器也通过发送一个包来应答客户端的浏览器,告诉浏览器可以发送数据给服务器

   3)发送HTTP请求

 4. 服务器接到请求后,返回相应的响应内容

 5. 浏览器解析从服务器端返回的响应内容,并且把页面显现出来

当输入URL之后,浏览器就要知道这个URL对应的IP是什么,只有知道了IP地址,浏览器才能准备的把请求发送到指定的服务器的具体IP和端口号上面。然后服务器端把响应结果发送到客户端。这个响应结果就是html的文档,不包含什么图片,脚本,CSS等的,也就是页面的html结构。

1.6 web服务

1.6.1 客户端

可以直接采用pythonRequests 模块:

r = requests.get('https://github.com/timeline.json')

r = requests.post("http://httpbin.org/post")
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)

1.7 http格式

1.7.1 请求格式

GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*

第一行是请求方法,以及版本

后面是:头、数据(表单内容)进行请求。

1.7.2 回应格式

服务器的回应如下。

HTTP/1.0 200 OK 
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84

<html>
  <body>Hello World</body>
</html>

回应的格式是"头信息 + 一个空行(\r\n+ 数据"。其中,第一行是"协议版本 + 状态码(status code+ 状态描述"

1.8 图片文件上传

客户端:

#coding=utf-8  
import requests  
url = 'http://localhost:8080'  
path = u'D:快盘阿狸头像.jpg'  
print path  
files = {'file': open(path, 'rb')}  
r = requests.post(url, files=files)  
print r.url,r.text  

服务端:

#coding=utf-8  
from BaseHTTPServer import BaseHTTPRequestHandler  
import cgi  
class   PostHandler(BaseHTTPRequestHandler):  
    def do_POST(self):  
        form = cgi.FieldStorage(  
            fp=self.rfile,  
            headers=self.headers,  
            environ={'REQUEST_METHOD':'POST',  
                     'CONTENT_TYPE':self.headers['Content-Type'],  
                     }  
        )  
        self.send_response(200)  
        self.end_headers()  
        self.wfile.write('Client: %sn ' % str(self.client_address) )  
        self.wfile.write('User-agent: %sn' % str(self.headers['user-agent']))  
        self.wfile.write('Path: %sn'%self.path)  
        self.wfile.write('Form data:n')  
        for field in form.keys():  
            field_item = form[field]  
            filename = field_item.filename  
            filevalue  = field_item.value  
            filesize = len(filevalue)#文件大小(字节)  
            print len(filevalue)  
            with open(filename.decode('utf-8')+'a','wb') as f:  
                f.write(filevalue)  
        return  
if __name__=='__main__':  
    from BaseHTTPServer import HTTPServer  
    sever = HTTPServer(('localhost',8080),PostHandler)  
    print 'Starting server, use <Ctrl-C> to stop'  
    sever.serve_forever()  

参考文献:

1、http://blog.csdn.net/testcs_dn/article/details/50449106

2、http://www.ruanyifeng.com/blog/2016/08/http.html

猜你喜欢

转载自blog.csdn.net/hjimce/article/details/79506793