Python基础教程(第3版)中文版 第14章 网络编程(笔记)

简介: Python基础教程(第3版)中文版 第14章 网络编程(笔记)

                                       第14章 网络编程

1.几个网络模块

1.模块socket

网络编程中的一个基本组件是socket(套接字)。

socket基本上是一个信息通道,两端各有一个程序。

套接字分为两类:服务器套接字和客户端套接字。

创建服务器套接字后,让它等待连接请求的到来。

客户端套接字只需连接,完成任务后断开连接。

套接字是模块socket中socket类的实例。

实例化套接字最多指定3参数:

地址族(默认为socket.AF_INET):

流套接字(socket.SOCK_STREAM,默认)/数据包套接字(socket.SOCK_DGRAM)

协议(默认0)

创建普通套接字无需提供参数。

服务器套接字先调用方法 bind,再调用方法 listen来监听方法bind指定的地址。

#地址是一个格式为(host,port)的元组。host是主机名,port是端口号。

方法 listen提供一个参数--待办任务清单的长度


服务器套接字开始监听后,就可接受(accept)客户端连接了。方法accept将阻断(等待) 直到客户端连接到来,返回一个(client, address)的元组,client是客户端套接字,address是地址。


为传输数据,套接字提供了2个方法:

send(发送):提供字符串

recv(接收):指定最多接收多少个字节的数据(1024是个不错的选择)


实例:

#服务器

import socket

s = socket.socket()

host = socket.gethostname()

port = 1234

s.bind((host,port))

s.listen()

while True:

   c, addr = s.accept()

   print('Got connection from', addr)

   #注意下面这个字符串前加b转换成bytes

   c.send(b'Thank you for connecting')

   c.close()

#客户端

import socket

s = socket.socket()

host = socket.gethostname()

port = 1234

s.connect((host,port))

print(s.recv(1024))



2.模块urllib 和 urllib2

通过网络访问文件,可以使用URL(统一资源定位符)、

常见的应用是下载网页,提取信息。


1.打开远程文件

from urllib.request import urlopen

webpage = urlopen('http://www.python.org')

webpage将包含一个类似于文件的对象。支持文件的方法:close,readline,readlines等。

2.获取远程文件

urlretrieve返回一个格式为(filename,headers)的元组,filename是本地文件的名称,headers是一些文件相关的信息,如果给下载的文件指定名字,传入第二个参数。

from urllib.request import urlretrieve

urlretrieve('http://www.python.org','C:\\python_webpage.html')

3.其他模块(略)

2.SocketServer

创建服务器

SocketServer包含4个基本的服务器:

TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer

使用模块SocketServer编写服务器时,大部分代码都位于请求处理器中。基本请求处理程序类BaseRequestHandler将所有的操作都放在一个方法中--服务器调用的方法handle。这个方法可通过属性self.request来访问客户端套接字。如果处理流,可使用StreamRequestHandler类,它有另外两个属性:self.rfile(读取)和self.wfile(写入)

实例:

from socketserver import TCPServer, StreamRequestHandler

class Handler(StreamRequestHandler):

def handle(self):

addr = self.request.getpeername()

print('Got connection from', addr)

self.wfile.write('Thank you for connecting')

server = TCPServer(('', 1234), Handler)

server.serve_forever()  

3.多个连接

处理多个连接的主要方式有3种:分叉(forking)线程化异步I/O

分叉是一个Unix术语。对进程进行分叉时,基本上是复制它,得到两个进程都将从当前位置开始继续往下执行,且每个进程都有自己的内存副本。原进程是父进程,复制的进程是子进程。 在分叉服务器中,对每个客户端连接都通过分叉创建一个子进程,父进程继续监听,子进程处理客户端请求。请求结束,子进程退出。

线程是轻量级进程(子进程),都位于同一个进程中并共享内存。

1.使用SocketServer实现分叉和线程化

分叉服务器:

from socketserver import TCPServer, StreamRequestHandler

class Handler(StreamRequestHandler):

def handle(self):

addr = self.request.getpeername()

print('Got connection from', addr)

self.wfile.write('Thank you for connecting')

server = TCPServer(('', 1234), Handler)

server.serve_forever()

线程化服务器

from socketserver import TCPServer, ThreadingMinIn, StreamRequestHandler


class Server(ThreadingMixIn, TCPServer): pass


class Handler(StreamRequestHandler):


   def handle(self):

       addr = self.request.getpeername()

       print('Got connection from', addr)

       self.wfile.write('Thank you for connecting')


sever = Server(('' ,1234), Handler)

server.serve_forever()


2.使用select和poll(UNIX)实现异步I/O

函数select接受3个参数和1个可选参数。

前3个参数为序列,第4个参数为超时时间(单位为秒)

这3个序列分别表示需要输入和输出以及发生异常的连接。

#使用select的服务器

import socket, select

s = socket.socket()

host = socket.gethostname()

port = 1234

s.bind((host, port))

s.listen(5)

inputs = [s]

while True:

rs, ws, es = select.select(inputs, [], [])

for r in rs:

if r is s:

c, addr = s.accept()

print('Got connection from', addr)

inputs.append(c)

else:

try:

data = r.recv(1024)

disconnected = not data

except socket.error:

disconnected = True

if disconnected:

print(r.getpeername(), 'disconnected')

inputs.remove(r)

else:

print(data)  

4.Twisted

Twisted 是一个事件驱动的python网络框架。

...

 

相关文章
|
6月前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
639 55
|
12天前
|
调度 Python
探索Python高级并发与网络编程技术。
可以看出,Python的高级并发和网络编程极具挑战,却也饱含乐趣。探索这些技术,你将会发现:它们好比是Python世界的海洋,有穿越风暴的波涛,也有寂静深海的奇妙。开始旅途,探索无尽可能吧!
41 15
|
5月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
372 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
19天前
|
人工智能 Ruby Python
python__init__方法笔记
本文总结了Python中`__init__`方法的使用要点,包括子类对父类构造方法的调用规则。当子类未重写`__init__`时,实例化会自动调用父类的构造方法;若重写,则需通过`super()`或直接调用父类名称来显式继承父类初始化逻辑。文中通过具体代码示例展示了不同场景下的行为及输出结果,帮助理解类属性与成员变量的关系,以及如何正确使用`super()`实现构造方法的继承。
|
2月前
|
数据采集 存储 监控
Python 原生爬虫教程:网络爬虫的基本概念和认知
网络爬虫是一种自动抓取互联网信息的程序,广泛应用于搜索引擎、数据采集、新闻聚合和价格监控等领域。其工作流程包括 URL 调度、HTTP 请求、页面下载、解析、数据存储及新 URL 发现。Python 因其丰富的库(如 requests、BeautifulSoup、Scrapy)和简洁语法成为爬虫开发的首选语言。然而,在使用爬虫时需注意法律与道德问题,例如遵守 robots.txt 规则、控制请求频率以及合法使用数据,以确保爬虫技术健康有序发展。
241 31
|
2月前
|
数据采集 JSON API
Python 实战:用 API 接口批量抓取小红书笔记评论,解锁数据采集新姿势
小红书作为社交电商的重要平台,其笔记评论蕴含丰富市场洞察与用户反馈。本文介绍的小红书笔记评论API,可获取指定笔记的评论详情(如内容、点赞数等),支持分页与身份认证。开发者可通过HTTP请求提取数据,以JSON格式返回。附Python调用示例代码,帮助快速上手分析用户互动数据,优化品牌策略与用户体验。
|
2月前
|
存储 监控 算法
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
85 7
|
2月前
|
存储 数据库 Python
利用Python获取网络数据的技巧
抓起你的Python魔杖,我们一起进入了网络之海,捕捉那些悠游在网络中的数据鱼,想一想不同的网络资源,是不是都像数不尽的海洋生物,我们要做的,就是像一个优秀的渔民一样,找到他们,把它们捕获,然后用他们制作出种种美味。 **1. 打开魔法之门:请求包** 要抓鱼,首先需要一个鱼网。在Python的世界里,我们就是通过所谓的“请求包”来发送“抓鱼”的请求。requests是Python中常用的发送HTTP请求的库,用它可以方便地与网络上的资源进行交互。所谓的GET,POST,DELETE,还有PUT,这些听起来像偶像歌曲一样的单词,其实就是我们鱼网的不同方式。 简单用法如下: ``` im
74 14
|
2月前
|
域名解析 API PHP
VM虚拟机全版本网盘+免费本地网络穿透端口映射实时同步动态家庭IP教程
本文介绍了如何通过网络穿透技术让公网直接访问家庭电脑,充分发挥本地硬件性能。相比第三方服务受限于转发带宽,此方法利用自家宽带实现更高效率。文章详细讲解了端口映射教程,包括不同网络环境(仅光猫、光猫+路由器)下的设置步骤,并提供实时同步动态IP的两种方案:自建服务器或使用三方API接口。最后附上VM虚拟机全版本下载链接,便于用户在穿透后将服务运行于虚拟环境中,提升安全性与适用性。
|
2月前
|
数据采集 JSON API
Python 实战!利用 API 接口获取小红书笔记详情的完整攻略
小红书笔记详情API接口帮助商家和数据分析人员获取笔记的详细信息,如标题、内容、作者信息、点赞数等,支持市场趋势与用户反馈分析。接口通过HTTP GET/POST方式请求,需提供`note_id`和`access_token`参数,返回JSON格式数据。以下是Python示例代码,展示如何调用该接口获取数据。使用时请遵守平台规范与法律法规。

推荐镜像

更多