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网络框架。

...

 

相关文章
|
3月前
|
安全 网络协议 算法
Nmap网络扫描工具详细使用教程
Nmap 是一款强大的网络发现与安全审计工具,具备主机发现、端口扫描、服务识别、操作系统检测及脚本扩展等功能。它支持多种扫描技术,如 SYN 扫描、ARP 扫描和全端口扫描,并可通过内置脚本(NSE)进行漏洞检测与服务深度枚举。Nmap 还提供防火墙规避与流量伪装能力,适用于网络管理、渗透测试和安全研究。
490 1
|
5月前
|
JSON 监控 API
在线网络PING接口检测服务器连通状态免费API教程
接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。
|
5月前
|
编解码 数据安全/隐私保护 Python
抖音批量发布视频工具,自动上传视频作品笔记,python发布软件
这个抖音批量发布工具包含三个主要模块:主上传程序、配置文件和视频预处理工具。主程序
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
1307 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
5月前
|
API 数据安全/隐私保护 Python
小红书批量发布协议, 抖音自动批量发布软件脚本,笔记作品视频自动发布工具【python】
这个工具框架包含了小红书和抖音的批量发布功能,支持图片和视频处理、定时发布等功能
|
5月前
|
Web App开发 数据安全/隐私保护 Python
抖音快手小红书哔哩哔哩,批量发布作品笔记视频工具,自动发布作品上传笔记视频【python】
这个工具实现了四大平台的视频批量上传功能,包含完整的异常处理和日志记录。使用时需要配置
|
5月前
|
存储 JSON API
小红书批量发布笔记工具,小红书批量上传软件,python框架分享
这个框架包含了配置文件、工具函数、API封装和主程序四个模块。使用时需要先配置账号信息,
|
机器学习/深度学习 数据可视化 计算机视觉
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
这篇文章详细介绍了如何通过可视化深度学习中每层特征层来理解网络的内部运作,并使用ResNet系列网络作为例子,展示了如何在训练过程中加入代码来绘制和保存特征图。
365 1
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
|
7月前
|
人工智能 Ruby Python
python__init__方法笔记
本文总结了Python中`__init__`方法的使用要点,包括子类对父类构造方法的调用规则。当子类未重写`__init__`时,实例化会自动调用父类的构造方法;若重写,则需通过`super()`或直接调用父类名称来显式继承父类初始化逻辑。文中通过具体代码示例展示了不同场景下的行为及输出结果,帮助理解类属性与成员变量的关系,以及如何正确使用`super()`实现构造方法的继承。
362 9
|
8月前
|
数据采集 存储 监控
Python 原生爬虫教程:网络爬虫的基本概念和认知
网络爬虫是一种自动抓取互联网信息的程序,广泛应用于搜索引擎、数据采集、新闻聚合和价格监控等领域。其工作流程包括 URL 调度、HTTP 请求、页面下载、解析、数据存储及新 URL 发现。Python 因其丰富的库(如 requests、BeautifulSoup、Scrapy)和简洁语法成为爬虫开发的首选语言。然而,在使用爬虫时需注意法律与道德问题,例如遵守 robots.txt 规则、控制请求频率以及合法使用数据,以确保爬虫技术健康有序发展。
1096 31

推荐镜像

更多