计算机网络有很多种类型,根据不同类型的计算机网络。通常计算机网络是按照规模大小和延申范围分类,常见的类型有:局部网(LAN)、城域网(MAN)和广域网。
在计算机网络中实现通信必须有一些约定,这些约定被称为通信协议。通信协议负责对传输速度、传输代码、代码结论、传输控制步骤、出错控制等制定处理标准。
通信协议通常由三部分组成:一是语义层,用于决定双方对话的类型;二是语法部分,用于决定双方对话的格式;三是变换规则,用于决定通信系统的应答关系。
ip地址用于唯一标识网络中的一个通信实体,这个通信实体既可以是一个主机,也可以是一台打印机,或者路由器的一个端口。
IP地址被分为A、B、C、D、E五类,每个类别的网络标识和主机标识各有规则。
网络层协议主要是IP,它是所有互联网协议的基础,其中ICMP、IGMP、ARP、PARP等协议都可认为是IP协议族的子协议。通常来说,很少会基于网络层进行应用程序编程。
传输层协议主要是TCP和UDP,Python提供了socket等模块针对传输层协议进行编程。
下面为Python标准库中的网络相关模块:
URL对象代表统一资源定位器,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对复杂对象的引用,例如对数据库或搜索引擎的查询。通常情况下,URL可以由协议名、主机、端口和资源路径组成,即满足如下格式:
protocol://host:port/path
urlib模块包含了多个用于处理URL的子模块:
from urllib.parse import *
result = urlparse('http://www.crazy.org:80/index.php;yeeku?name=fkit#frag')
print(result)
#通过属性名和索引获取URL各部分
print('scheme:',result.scheme,result[0])
print('主机和端口:',result.netloc,result[1])
print('主机:',result.hostname)
print('端口:',result.port)
print('资源路径:',result.path,result[2])
print('参数:',result.params,result[3])
print('查询字符串:',result.query,result[4])
print('fragment:',result.query,result[5])
print(result.geturl())
#------------------下面为程序的输出------------------------
ParseResult(scheme='http', netloc='www.crazy.org:80', path='/index.php', params='yeeku', query='name=fkit', fragment='frag')
scheme: http http
主机和端口: www.crazy.org:80 www.crazy.org:80
主机: www.crazy.org
端口: 80
资源路径: /index.php /index.php
参数: yeeku yeeku
查询字符串: name=fkit name=fkit
fragment: name=fkit frag
http://www.crazy.org:80/index.php;yeeku?name=fkit#frag
如果被解析的URL以双斜线(//)开头,那么urlparse()函数可以识别出主机,只是缺少scheme部分。但如果被解析的URL既没有scheme,也没有以双斜线(//)开头,那么urlparse()函数将会把这些url当成资源路径。
from urllib.parse import *
result = urlparse('//www.crazy.org:80/index.php;yeeku?name=fkit#frag')
print(result)
#通过属性名和索引获取URL各部分
print('scheme:',result.scheme,result[0])
print('主机和端口:',result.netloc,result[1])
print('主机:',result.hostname)
print('端口:',result.port)
print('资源路径:',result.path,result[2])
print('参数:',result.params,result[3])
print('查询字符串:',result.query,result[4])
print('fragment:',result.query,result[5])
print(result.geturl())
print('----------------------------')
result = urlparse('www.crazy.org:80/index.php')
print(result)
#通过属性名和索引获取URL各部分
print('scheme:',result.scheme,result[0])
print('主机和端口:',result.netloc,result[1])
print('主机:',result.hostname)
print('端口:',result.port)
print('资源路径:',result.path,result[2])
print('参数:',result.params,result[3])
print('查询字符串:',result.query,result[4])
print('fragment:',result.query,result[5])
print(result.geturl())
#-------------------------以下为程序的输出---------------------------
ParseResult(scheme='', netloc='www.crazy.org:80', path='/index.php', params='yeeku', query='name=fkit', fragment='frag')
scheme:
主机和端口: www.crazy.org:80 www.crazy.org:80
主机: www.crazy.org
端口: 80
资源路径: /index.php /index.php
参数: yeeku yeeku
查询字符串: name=fkit name=fkit
fragment: name=fkit frag
//www.crazy.org:80/index.php;yeeku?name=fkit#frag
----------------------------
ParseResult(scheme='www.crazy.org', netloc='', path='80/index.php', params='', query='', fragment='')
scheme: www.crazy.org www.crazy.org
主机和端口:
主机: None
端口: None
资源路径: 80/index.php 80/index.php
参数:
查询字符串:
fragment:
www.crazy.org:80/index.php
parse_qs()和parse_qsl()(这个1代表list)两个函数都用于解析查询字符串,只不过返回值不同。
from urllib.parse import *
#解析查询字符串,返回dict
result = urlparse('name=fkit&name=%E7%96%AF%E7%8Bjava&age=12')
print(result)
#解析查询字符串,返回list
result = parse_qsl('name=fkit&name=%E7%96%AF%E7%8Bjava&age=12')
print(result)
print(urlencode(result))
urljoin()函数负责将两个URL连接在一起,返回代表绝对地址的URL。
from urllib.parse import *
#被拼接的URL不以斜线开头
result = urljoin('http://www.crazyit.org/users/login.html','help.html')
print(result)
result = urljoin('http://www.crazyit.org/users/login.html','book/list.html')
print(result)
result = urljoin('http://www.crazyit.org/users/login.html','/help.html')
print(result)
result = urljoin('http://www.crazyit.org/users/login.html','//help.html')
print(result)
#------------------------------------------下面为程序的输出----------------------------------------------
from urllib.parse import *
#被拼接的URL不以斜线开头
result = urljoin('http://www.crazyit.org/users/login.html','help.html')
print(result)
result = urljoin('http://www.crazyit.org/users/login.html','book/list.html')
print(result)
result = urljoin('http://www.crazyit.org/users/login.html','/help.html')
print(result)
result = urljoin('http://www.crazyit.org/users/login.html','//help.html')
print(result)
urllib.request.urlopen(url,data=None)方法,该方法用于打开url指定的资源,并从中读取数据。根据请求url的不同,该方法的返回值会发生改变。如果url是一个http地址,那么该方法返回一个http.client.httpresponse对象。