几个网络模块



文章目录

  • 几个网络模块
  • 一、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()

运行结果如下:

python neurolab网络 python 网络模块_python neurolab网络

二、模块 urllib 和 urllib2


1. 作用

让你能够通过网络访问文件,就像这些文件位于你的计算机中一样。

  • 简单的下载 → urllib
  • 如果需要实现HTTP身份验证或Cookie,抑或编写扩展来处理自己的协议 → urllib2

2. 使用

2.1 打开远程文件



2.1.1 打开本地文件 vs 打开远程文件

打开本地文件

打开远程文件

提供的功能

可读可写

只能使用读取模式

实现方法

open & file

模块 urllib.request 中的函数urlopen


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/'

[ 注意 ]  

  1. urlopen返回的类似于文件的对象,支持方法closereadreadlinereadlines,还支持迭代等。
  2. cmd 清屏:cls
  3. 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版)