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

...

 

相关文章
|
25天前
|
运维 监控 数据可视化
Python 网络请求架构——统一 SOCKS5 接入与配置管理
通过统一接入端点与标准化认证,集中管理配置、连接策略及监控,实现跨技术栈的一致性网络出口,提升系统稳定性、可维护性与可观测性。
|
21天前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的青少年网络使用情况分析及预测系统
本研究基于Python大数据技术,构建青少年网络行为分析系统,旨在破解现有防沉迷模式下用户画像模糊、预警滞后等难题。通过整合多平台亿级数据,运用机器学习实现精准行为预测与实时干预,推动数字治理向“数据驱动”转型,为家庭、学校及政府提供科学决策支持,助力青少年健康上网。
|
30天前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
106 1
|
2月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
642 19
|
2月前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
3月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
205 18
|
2月前
|
数据采集 存储 JSON
使用Python获取1688商品详情的教程
本教程介绍如何使用Python爬取1688商品详情信息,涵盖环境配置、代码编写、数据处理及合法合规注意事项,助你快速掌握商品数据抓取与保存技巧。
|
3月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
227 0
|
3月前
|
并行计算 算法 Java
Python3解释器深度解析与实战教程:从源码到性能优化的全路径探索
Python解释器不止CPython,还包括PyPy、MicroPython、GraalVM等,各具特色,适用于不同场景。本文深入解析Python解释器的工作原理、内存管理机制、GIL限制及其优化策略,并介绍性能调优工具链及未来发展方向,助力开发者提升Python应用性能。
224 0
|
3月前
|
数据采集 索引 Python
Python Slice函数使用教程 - 详解与示例 | Python切片操作指南
Python中的`slice()`函数用于创建切片对象,以便对序列(如列表、字符串、元组)进行高效切片操作。它支持指定起始索引、结束索引和步长,提升代码可读性和灵活性。

推荐镜像

更多