几个网络模块
文章目录
- 几个网络模块
- 一、socket模块
- 1. 实现最简单的服务器和客户端
- 二、模块 urllib 和 urllib2
- 1. 作用
- 2. 使用
- 2.1 打开远程文件
- 2.1.1 打开本地文件 vs 打开远程文件
- 2.1.2 实现代码(实例)
- 2.2 下载远程文件
- 2.3 其他一些实用函数
一、socket模块
套接字分为两类:
- 服务器套接字
- 客户端套接字
套接字是模块socket中socket类的实例。
实例化套接字时最多可指定三个参数(创建普通套接字时,不用提供任何参数):
- 一个地址族(默认为socket.AF_INET);
- 是流套接字(socket.SOCK_STREAM,默认设置)还是数据报套接字
(socket.SOCK_DGRAM); - 协议(使用默认值0就好)。
1. 实现最简单的服务器和客户端
最简单的服务器 and 最简单的客户端 |
import socket
s = socket.socket() # 创建普通套接字
host = socket.gethostname()
port = 1234
s.bind((host, port)) # 1.服务器套接字先调用方法bind
s.listen(5) # 2.调用方法listen来监听特定的地址(接收一个参数——待办任务清单的长度,即:最多可有多少个连接在队列中等待接纳,达到这个数量后开始拒绝连接)
while True:
c, addr = s.accept() # 4.接收客户端连接:将阻断(等待)到客户端连接到来为止,然后返回一个格式为(client, address)的元组,其中client是一个客户端套接字,而address是前面解释过的地址。服务器能以其认为合适的方式处理客户端连接,然后再次调用accept以接着等待新连接到来。这通常是在一个无限循环中完成的。
print('Got connection from', addr)
c.send('Thank you for connecting') # 5.发送数据:调用方法send并提供一个字符串
c.close()
import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host, port)) # 3.当服务器套接字调用方法listen来监听特定的地址后,客户端套接字就可以连接到服务器了:调用方法connect并提供调用方法bind时指定的地址
print(s.recv(1024)) # 6.接收数据:调用recv并指定最多接收多少个字节的数据。如果不确定该指定什么数字,1024是个不错的选择。
然后服务器将产生如下结果:
Got connection from ('172.20.248.65', 60192)
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
TypeError: a bytes-like object is required, not 'str'
显然,产生了一个错误,经查阅,发现:
socket.send(bytes[, flags])
显然 ’ Thank you for connecting ’ 是 str
,不是 byte-like object
(类似byte的object),而 python提供了 bytes 和 str 类型转换函数:encode()
、decode()
- str → bytes: encode()
- bytes → str:decode()
- 【补充】 如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。
修改服务器代码:
import socket
s = socket.socket() # 创建普通套接字
host = socket.gethostname()
port = 1234
s.bind((host, port)) # 1.服务器套接字先调用方法bind
s.listen(5) # 2.调用方法listen来监听特定的地址(接收一个参数——待办任务清单的长度,即:最多可有多少个连接在队列中等待接纳,达到这个数量后开始拒绝连接)
while True:
c, addr = s.accept() # 4.接收客户端连接:将阻断(等待)到客户端连接到来为止,然后返回一个格式为(client, address)的元组,其中client是一个客户端套接字,而address是前面解释过的地址。服务器能以其认为合适的方式处理客户端连接,然后再次调用accept以接着等待新连接到来。这通常是在一个无限循环中完成的。
print('Got connection from', addr)
c.send('Thank you for connecting'.encode()) # 发送数据
c.close()
运行结果如下:
二、模块 urllib 和 urllib2
1. 作用
让你能够通过网络访问文件,就像这些文件位于你的计算机中一样。
- 简单的下载 → urllib
- 如果需要实现HTTP身份验证或Cookie,抑或编写扩展来处理自己的协议 → urllib2
2. 使用
2.1 打开远程文件
2.1.1 打开本地文件 vs 打开远程文件
打开本地文件 | 打开远程文件 | |
提供的功能 | 可读可写 | 只能使用读取模式 |
实现方法 |
| 模块 |
2.1.2 实现代码(实例)
>>> from urllib.request import urlopen
# 变量webpage将包含一个类似于文件的对象,这个对象与网页http://www.python.org相关联
>>> webpage = urlopen('http://www.python.org')
# urlopen返回的类似于文件的对象支持方法close、read、readline和readlines,还支持代等。
>>> # webpage.read()
>>> b'<!doctype html>\n<!--[if lt IE 7]> <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9"> <![endif]-->\n<!--[if IE 7]> <html class="no-js ie7 lt-ie8 lt-ie9"> <![endif]-->\n<!--[if IE 8]> <html class="no-js ie8 lt-ie9"> <![endif]-->\n<!--[if gt IE 8]><!--><html class="no-js" lang="en" dir="ltr"> <!--<![endif]-->\n\n<head>\n <meta charset="utf-8">\n <meta http-equiv="X-UA-Compatible" content="IE=edge">\n\n <link rel="prefetch" href="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js">\n\n <meta name="application-name" content="Python.org">\n <meta name="msapplication-tooltip" content="The official home of the Python Programming Language">\n <meta name="apple-mobile-web-app-title" content="Python.org">\n <meta name="apple-mobile-web-app-capable" content="yes">\n <meta name="apple-mobile-web-app-status-bar-style" content="black">\n\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <meta name="HandheldFriendly" content="True">\n <meta name="format-detection" content="telephone=no">\n <meta http-equiv="cleartype" content="on">\n <meta http-equiv="imagetoolbar" content="false">\n\n <script src="/static/js/libs/modernizr.js"></script>\n\n <link href="/static/stylesheets/style.67f4b30f7483.css" rel="stylesheet" type="text/css" title="default" />\n <link href="/static/stylesheets/mq.3ae8e02ece5b.css" rel="stylesheet" type="text/css" media="not print,
...
# 提取所打开网页中链接About的相对URL
>>> import re
>>> text = webpage.read()
>>> m = re.search(b'<a href="([^"]+)" .*?>about</a>', text, re.IGNORECASE)
>>> m.group(1)
'/about/'
[ 注意 ]
- urlopen返回的类似于文件的对象,支持方法
close
、read
、readline
和readlines
,还支持迭代
等。 - cmd 清屏:
cls
- cmd 退出 python :
exit()
2.2 下载远程文件
>>> from urllib.request import urlretrieve
>>> urlretrieve('http://www.python.org','F:\\study\\work\\python_webpage.html')
('F:\\study\\work\\python_webpage.html', <http.client.HTTPMessage object at 0x000001F1D3387B70>)
[ 注意 ]
urlretrieve
:
- 返回一个格式为
(filename, headers)
的元组 。
-
filename
:本地文件的名称 -
headers
:包含一些有关远程文件的信息
- 如果要给下载的副本指定文件名,可通过第二个参数来提供 。
- 目录必须“\\”
- 一定要写上文件名
- 如果没有指定文件名(没有给第二个参数):
- 下载的副本将放在某个临时位置,可使用函数
open
来打开。 - 使用完毕后,你可能想将其删除,以免占用磁盘空间。要清空这样的临时文件,可调用函数
urlcleanup()
,它将负责替你完成清空工作。
2.3 其他一些实用函数
除了通过 URL 读取和下载文件外,urllib 还提供了一些用于操作 URL 的函数:
-
quote(string[, safe])
:返回一个字符串,其中所有的特殊字符(在URL中有特殊意义的字符)都已替换为对URL友好的版本(如将~替换为%7E)。如果要将包含特殊字符的字符串用作URL,这很有用。参数safe是一个字符串(默认为’/’),包含不应像这样对其进行编码的字符。 -
quote_plus(string[, safe])
:类似于quote,但也将空格替换为加号。 -
unquote(string)
:与quote相反。 -
unquote_plus(string)
:与quote_plus相反。 -
urlencode(query[, doseq])
:将映射(如字典)或 由包含两个元素的元组(形如(key, value))组成的序列转换为“使用URL编码的”字符串。这样的字符串可用于CGI查询中。
[ 参考链接
1. send()参数问题参考链接:
2. [挪]-Magnus-Lie-Hetland-Python基础教程(第3版)