Python学习笔记14:网络编程
网络编程
几个网络模块
- 模块socket
# 简单的服务器
import socket
s = socket.socket() host = socket.gethostname()
port = 1234
s.bind((host, port))s.listen(5)
while True: c, addr = s.accept() print('Got connection from', addr) c.send('Thank you for connecting')c.close()# 简单的客户端
import socket
s = socket.socket() host = socket.gethostname()
port = 1234 s.connect((host, port))
print(s.recv(1024))
- 模块urllib和urllib2
打开远程文件:urlopen
>>> from urllib.request import urlopen
>>> webpage = urlopen('http://www.python.org')>>> import re
>>> text = webpage.read()
>>> m = re.search(b'<a href="([^"]+)" .*?>about</a>', text, re.IGNORECASE)
>>> m.group(1)
'/about/'
获取远程文件:urlretrieve
>>> urlretrieve('http://www.python.org', 'C:\\python_webpage.html')
清空这样的临时文件:urlcleanup
- 其他模块
标准库中一些与网络相关的模块
| 模块 | 描述 |
|---|---|
| asynchat | 包含补充asyncore的功能(参见第24章) |
| asyncore | 异步套接字处理程序(参见第24章) |
| cgi | 基本的CGI支持(参见第15章) |
| Cookie | Cookie对象操作,主要用于服务器 |
| cookielib | 客户端Cookie支持 |
| 电子邮件(包括MIME)支持 | |
| ftplib | FTP客户端模块 |
| gopherlib | Gopher客户端模块 |
| httplib | HTTP 客户端模块 |
| imaplib | IMAP4客户端模块 |
| mailbox | 读取多种邮箱格式 |
| mailcap | 通过mailcap文件访问MIME配置 |
| mhlib | 访问MH邮箱 |
| nntplib | NNTP客户端模块(参见第23章) |
| poplib | POP客户端模块 |
| robotparser | 解析Web服务器robot文件 |
| SimpleXMLRPCServer | 一个简单的XML-RPC服务器(参见第27章) |
| smtpd | SMTP服务器模块 |
| smtplib | SMTP客户端模块 |
| telnetlib | Telnet客户端模块 |
| urlparse | 用于解读URL |
| xmlrpclib | XML-RPC客户端支持(参见第27章) |
SocketServer
- 4个基本服务器:TCPServer(支持TCP套接字流)、UDPServer(支持UDP数据报套接字)以及更难懂的UnixStreamServerUnixDatagramServer。
- 请求处理器:基本请求处理程序类BaseRequestHandler将所有操作都放在一个方法中——服务器调用的方法handle。这个方法可通过属性self.request来访问客户端套接字。可使用StreamRequestHandler类,它包含另外两个属性:self.rfile(用于读取)和self.wfile(用于写入)。
# 基于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()
多个连接
- 分叉(forking) 占用的资源较多,且在客户端很多时可伸缩性不佳(但只要客户端数量适中,分叉在现代UNIX和Linux系统中的效率很高。如果系统有多个CPU,效率就更高了)
- 线程化 可能带来同步问题
- 异步I/O
- 使用 SocketServer 实现分叉和线程化
# 分叉服务器
from socketserver import TCPServer, ForkingMixIn, StreamRequestHandler class Server(ForkingMixIn, TCPServer): pass class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print('Got connection from', addr) self.wfile.write('Thank you for connecting') server = Server(('', 1234), Handler)
server.serve_forever()
# 线程化服务器
from socketserver import TCPServer, ThreadingMixIn, 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') server = Server(('', 1234), Handler)
server.serve_forever()
- 使用 select 和 poll 实现异步 I/O
当服务器与客户端通信时,来自客户端的数据可能时断时续
- 分叉和线程化:一个进程(线程)等待数据时,其他进程(线程)可继续处理其客户端。
- 异步I/O:只处理当前正在通信的客户端。你甚至无需不断监听,只需监听后将客户端加入队列即可。
# 使用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)
# 使用poll的简单服务器
import socket, select s = socket.socket() host = socket.gethostname()
port = 1234
s.bind((host, port))fdmap = {s.fileno(): s} s.listen(5)
p = select.poll()
p.register(s)while True: events = p.poll() for fd, event in events: if fd in fdmap: c, addr = s.accept() print('Got connection from', addr) p.register(c)fdmap[c.fileno()] = c elif event & select.POLLIN:data = fdmap[fd].recv(1024) if not data: # 没有数据 --连接已关闭print(fdmap[fd].getpeername(), 'disconnected') p.unregister(fd)del fdmap[fd] else: print(data)
Twisted
基于事件:要编写简单的服务器,只需实现处理如下情形的事件处理程序:客户端发起连接,有数据到来,客户端断开连接(以及众多其他的事件)。专用类可在基本类的基础上定义更细致的事件,如包装“数据到来”事件,收集换行符之前的所有数据再分派“数据行到来”事件。
# 使用Twisted创建的简单服务器
from twisted.internet import reactor
from twisted.internet.protocol import Protocol, Factory class SimpleLogger(Protocol): def connectionMade(self): print('Got connection from', self.transport.client) def connectionLost(self, reason): print(self.transport.client, 'disconnected') def dataReceived(self, data): print(data)factory = Factory()
factory.protocol = SimpleLogger reactor.listenTCP(1234, factory)
reactor.run()
PS:你不能使用事件处理策略来向客户端发送数据。这种工作是使用对象self.transport完成的,它包含一个write方法。这个对象还有一个client属性,其中包含客户端的地址(主机名和端口)。
小结
套接字和模块socket:套接字是让程序(进程)能够通信的信息通道,这种通信可能需要通过网络进行。模块socket让你能够在较低的层面访问客户端套接字和服务器套接字。服
务器套接字在指定的地址处监听客户端连接,而客户端套接字直接连接到服务器。
urllib和urllib2:这些模块让你能够从各种服务器读取和下载数据,为此你只需提供指向数据源的URL即可。模块urllib是一种比较简单的实现,而urllib2功能强大、可扩展
性极强。这两个模块都通过诸如urlopen等函数来完成工作。
框架SocketServer:这个框架位于标准库中,包含一系列同步服务器基类,让你能够轻松地编写服务器。它还支持使用CGI的简单Web(HTTP)服务器。如果要同时处理多个连
接,必须使用支持分叉或线程化的混合类。
select和poll:这两个函数让你能够在一组连接中找出为读取和写入准备就绪的连接。这意味着你能够以循环的方式依次为多个连接提供服务,从而营造出同时处理多个连接的
假象。另外,相比于线程化或分叉,虽然使用这两个函数编写的代码要复杂些,但解决
方案的可伸缩性和效率要高得多。
Twisted:这是Twisted Matrix Laboratories开发的一个框架,功能丰富而复杂,支持大多数主要的网络协议。虽然这个框架很大且其中使用的一些成例看起来宛如天书,但其基本用法简单而直观。框架Twisted也是异步的,因此效率和可伸缩性都非常高。对很多自定
义网络应用程序来说,使用Twisted来开发很可能是最佳的选择。
相关文章:
Python学习笔记14:网络编程
网络编程 几个网络模块 模块socket # 简单的服务器 import socket s socket.socket() host socket.gethostname() port 1234 s.bind((host, port))s.listen(5) while True: c, addr s.accept() print(Got connection from, addr) c.send(Thank you for connecting)c.…...
初入了解——什么是VUE
个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…...
代码规范(C++)
1.命名规范 1.目录/文件 字母、数字、下划线构成,不同单词用下划线隔开。 2.函数/接口 小驼峰命名法。 3.命名空间 字母、数字、下划线构成,不同单词用下划线隔开,但是尽量只使用一个单词。 4.结构体/类 大驼峰命名法,不包…...
React教程详解四(hooks、pureComponent、Context通信、错误边界、children props与render props)
前言 hooks是react16.8.0版本新增加的新特性/新语法,最大的特点是可以在开发者在函数组件中使用state以及其它React特性,下面分别对其介绍~ React.useState() state hook能让函数组件也可以拥有state状态,方便其进行state状态的…...
【Spring从成神到升仙系列 二】2023年再不会 IOC 源码,就要被淘汰了
👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,阿里云专家博主📕系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…...
菜鸟的进阶--手写一个小型dubbo框架
1.rpc调用流程2.组件1.Redis注册中心3.编解码/序列化在本例的Netty通信中,由于每次调用rpc服务都要发送同一个类对象invoker,所以可以使用Protobuf。但是在接受方法调用结果的时候就不行了,因为我们无法提前确定对方方法返回结果的类型&#…...
js逆向爬取某音乐网站某歌手的歌曲
js逆向爬取某音乐网站某歌手的歌曲一、分析网站1、案例介绍2、寻找列表页Ajax入口(1)页面展示图。(2)寻找部分歌曲信息Ajax的token。(3)寻找歌曲链接(4)获取歌曲名称和id信息3、寻找…...
为什么软件测试面试了几个月都没有offer,从HR角度分析
首先,我觉得你在软件测试面试的过程中,逻辑比较混乱的最大一个原因是,说明你没有形成一个一个整体的体系。 导致你说的时候很多东西都杂乱无章。 我个人认为软件测试,其实开始首先进行的是一些需求的分析工作,之后呢…...
DC-7 靶场学习
文章目录信息搜集账号密码获取修改密码反弹shell得到flag信息搜集 首先获取目标ip。 arp-scan -l nmap -sP 192.168.28.0/24得到目标ip为: 192.168.28.139先访问页面。 翻译一下。 欢迎来到 DC-7DC-7引入了一些“新”概念,但我会让你弄清楚它们是什么…...
深入理解JavaScript的事件冒泡与事件捕获
前言JavaScript中提供了很多操作DOM的API。事件冒泡和事件捕获是指浏览器中处理DOM元素上事件的两种不同方式。事件冒泡和事件捕获都是JavaScript事件模型中的一部分,可以用来处理事件。对于这个问题,在实际开发中,并不是非常重要,…...
格密码学习笔记(六):格中模运算
文章目录格中取模运算CVP和格的陪集致谢格中取模运算 定义(格的基本区域) P⊂Rn:{Px∣x∈L}\mathcal{P} \subset \mathbb{R}^n : \{ \mathcal{P} \bm{x} | \bm{x} \in \mathcal{L} \}P⊂Rn:{Px∣x∈L}是Rn\mathbb{R}^nRn的一种划分。 用P\mathcal{P}P对…...
【C++】非常重要的——多态
凡是面向对象的语言,都有三大特性,继承,封装和多态,但并不是只有这三个特性,是因为者三个特性是最重要的特性,那今天我们一起来看多态! 目录 1.多态的概念 1.1虚函数 1.2虚函数的重写 1.3虚…...
发票账单很多?python助你批量完成数据提取
每天面对成堆的发票,无论是税务发票还是承兑单据,抑或是其他各类公司数据要从照片、PDF等不同格式的内容中提取,我们都有必要进行快速办公的能力提升。因此,我们的目标要求就十分明显了,首先要从图片中获取数据&#x…...
[闪存2.1] NAND FLASH特性串烧 | 不了解闪存特性,你能用好闪存产品吗?
前言 为了利用好闪存, 发挥闪存的优势, 以达到更好的性能和使用寿命, 那自然要求了解闪存特性。 闪存作为一种相对较新的存储介质, 有很多特别的特性。 一.闪存的特性 凡是采用Flash Memory的存储设备,可以统称为闪存存储。我们经常谈的固态硬盘(SSD),可以由volatile/…...
面试官问我按钮级别权限怎么控制,我说v-if,面试官说再见
最近的面试中有一个面试官问我按钮级别的权限怎么控制,我说直接v-if啊,他说不够好,我说我们项目中按钮级别的权限控制情况不多,所以v-if就够了,他说不够通用,最后他对我的评价是做过很多东西,但…...
阿里云服务器使用教程:CentOS 7安装nginx详细步骤
目录 1、下载nginx压缩包 2、配置nginx安装所需环境 3、解压nginx压缩包 4、编译安装nginx 5、nginx启动...
Android JNI浅析、Java和Native通信对象的传值和回调
简单了解一下jni JNI是一个本地编程接口,它允许运行在Java虚拟机的Java代码与用其他语言(如C,C和汇编)编写的库交互。 jni函数签名 首先看一下java类型对应的jni类型: Java类型符号BooleanZByteBCharCShortSIntILongJFloatFDo…...
linux目录/usr/lib/systemd/system目录详解
文章目录前言一. systemd介绍二. service 脚本详解2.1 [Unit] 区块2.2 [Service] 区块2.3 [Install] 区块总结前言 init的进化经历了这么几个阶段: CentOS 5: SysV init,串行 CentOS 6:Upstart,并行,借鉴ubuntu CentOS 7:Syste…...
408考研计算机之计算机组成与设计——知识点及其做题经验篇目4:CPU的功能和基本结构
随着考研的慢慢复习,我们逐渐进入了计算机组成与设计的第五章中央处理器。它原名为CPU。姓C,名PU,字中央处理器,号计组难点,乃计算机之中心与核心部件,小编称之曰能算能控,赐名曰九天宏教普济生…...
2022-12-10青少年软件编程(C语言)等级考试试卷(五级)解析
2022-12-10青少年软件编程(C语言)等级考试试卷(五级)解析T1、漫漫回国路 2020年5月,国际航班机票难求。一位在美国华盛顿的中国留学生,因为一些原因必须在本周内回到北京。现在已知各个机场之间的航班情况,求问他回不回得来(不考虑转机次数和机票价格)。 时间限制:10…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
