网站首页 > 技术文章 正文
Scalers点评:在2015年,ScalersTalk成长会Python小组完成了《Python核心编程》第1轮的学习。到2016年,我们开始第二轮的学习,并且将重点放在章节的习题上。Python小组是成长会内部小组,如果你想和我们一起学习Python,你需要是成长会成员,并且完成相关进群任务。
我们的节奏是一周一章学到位,章节习题都会一个一个过。通过到位地执行,达到实质性的提升。
往期日志:
本周学习情况
本周(20160508-20160515)学习第十六章,章节内容为网络编程。本周复盘主持人为sophie。
本周主要内容
本周主要学习了Python的网络编程,是后面几章深入学习的基础。首先介绍了客户端/服务器架构,套接字,面向连接(TCP)与无连接(UDP)。然后练习了在Socket模块和SocketServer模块下创建TCP与UDP的服务器/客户端架构。
预备知识
客户端/服务器架构
硬件的客户端/服务器架构:打印机服务器,文件服务器…
软件客户端/服务器架构;Web服务器,软件服务器,窗口服务器
客户端和服务器通过一个通信端点连接
套接字—通信端点
socket是操作系统I/O系统的延伸部分,它扩展了操作系统的基本I/O到网络通信,使 进程和机器之间的通信成为可能。建立 socket 需要通过调用 socket 函数,并且还需要另外的调用来连接和激活它们( recv 和 send )
基于文件型的Unix套接字:AF_UNIX
基于网络的套接字: AF_INET
主机与端口
面向连接与无连接/TCP与UDP
TCP的通信方式通信前要建立一条连线,提供了顺序的、可靠的、不会重复的数据传输。而UDP无需建立连接就可以通讯,但数据到达的顺序,可靠性及不重复性无法保证
当socket建立的时候,TCP程序调用的是SOCK_STREAM,UDP调用的是SOCK_DGRAM
UDP程序没有办法探测服务器什么时候发送完数据。这是因为这里其实没有什么实际的连接。对connect的调用只是初始化了一些内在参数。同时,服务器也许不会返回任何数据,或者数据也许在传输过程中丢失,程序并没有智能地判断这个问题
socket模块函数.
socket模块函数
socket(socket_family,socket_type,protocol=0)
创建一个TCP/IP的套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
创建一个UDP/IP的套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
使用from socket import* 将socket模块导入,可以大幅减少代码
tcpSock = socket(AF_INET, SOCK_STREAM)
udpSock = socket(AF_INET, SOCK_DGRAM)
socket 对象(内建)方法
常用的套接字函数:
socket.accept 它提取出所监听套接字的等待连接队列中第一个连接请求,创建一个单独的客户端套接字(例程中的tcpCliSock)用于后续的通信,主端口空出来接受其他客户端的请求。
socket.recv/send:一个是向指定地址发送,一个是获得。
Python中的网络编程-TCP
创建一个TCP服务器
ss = socket # 创建服务器套接字 ss.bind # 把地址绑定到套接字上 ss.listen # 监听服务器 inf_loop: # 服务器无限循环 cs = ss.accept # 接受客户端连接 comm_loop: # 通信循环 cs = ss.recv/ss.send # 对话 cs.close # 关闭客户端套接字 ss.close # 关闭服务器套接字’
在Python中,利用Socket编写服务器和客户端通信程序,经常会遇到一个错误:
socket.error: [Errno 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次
这个提示会在端口冲突的时候出现,可能的原因是在服务器程序中创建一个Socket打 开一个端口后,在程序结束的时候没有关闭这个Socket,因此下次启动程序就会出现这个错误提示,解决方法:
在服务器程序结束的时候要关闭Socket
或者更换端口号
重启机器
创建TCP客户端
cs = socket # 创建客户端套接字 cs.connet # 尝试连接服务器 comm_loop: # 通信循环 cs.recv/cs.send #对话 cs.close #关闭客户端套接字
3. 运行我们的客户端与TCP服务器 先开服务器,后开客户端
Python中的网络编程-UDP
1.创建一个UDP服务器
ss = socket # 创建一个服务器套接字 ss.bind # 绑定服务器套接字 inf_loop: # 服务器无限循环 cs = ss.recvfrom/ss.sendto # 对话 ss.close
2.创建一个UDP客户端
3.运行我们的客户端与TCP服务器先开服务器,后开客户端
Python中的网络编程-SocketServer模块
SocketServer是标准库中一个较高级的模块。用来简化实现网络客户端与服务器所需的大量样板代码。
1.创建SocketServerTCP服务器与不使用该模块的区别:在服务器循环中,不在服务器中写代码,改成定义一个处理器。
from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH)
class MyRequestHandler(SRH): def handle(self): print '...connected from:', self.client_address self.wfile.write('[%s]%s'%(ctime,self.rfile.readline)) tcpServ = TCP(ADDR, MyRequestHandler)
2.创建SocketServerTCP客户端
SocketTCP客户端
SocketServerTCP客户端
通过对比SocketTCP客户端程序和SocketServerTCP客户端程序,可以发现SocketServer中的套接字建立在无限循环内部。SocketServer 的请求处理器的默认行为是接受连接,得到请求,然后就关闭连接。这使得我们不能在程序的运行时,一直保持连接状态,要每次发送数据到服务器的时候都要创建一个新的套接字。
3.执行客户端与TCP服务器与之前的TCP客户与服务器类似,但是连接了服务器两次
总结-建立网络服务器
1.服务器的特点是等待来自客户端的请求,发送应答。与客户端类似,使用的是和客户端同样的socket接口。建立socket:首先需要建立一个实际的socket对象,其次需要把它连接到远程服务器上。建立socket对象的时候需要告诉系统两件事情:通信协议和协议家族。
通信协议:Internet通信类型基本上都是AF_INET,和 IPv4 对应。
协议家族:SOCK_STREAM ( TCP通信 ) 或 SOCK_DGRAM ( UDP通信 )
TCP建立socket连接:
s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
UDP建立socket连接:
s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
2.设置socket选项(可选)。
s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
3.绑定到一个端口(同样,也可以是一个指定的网卡)。bind函数第一个参数是你要绑定的IP地址,通常为空,意思是可以绑定到所有的接口和地址。
s.bind(( host, port ))
4.侦听连接。唯一参数指明了服务器实际处理连接的时候,允许有多少个未决(等待)的连接在队列中等待。
s.listen(5)
5.接受连接。
通常服务器连续运行的办法是设计一个无限循环。这里的循环是:当你调用 accept 的时候,它只在有一个客户端连接后才返回,同时程序会停止,并不使用任何CPU资源。
在服务器端使用UDP,可以像使用TCP一样建立一个socket, 设置选项,并调用 bind 函数。然而,不必使用 listen 或 accept 函数,仅仅使用 recvfrom 函数就可以了。这个函数实际上会返回两个信息:收到的数据,以及发送这些数据的程序地址和端口号。
总结-建立网络客户端
1.客户端使用的是和服务器同样的socket接口
2.连接socket:一般需要一个tuple,包含远程主机名( 或IP地址) 和远程端口。连接一个socket一般使用如下代码:
ADDR = (HOST,PORT) s.connect(ADDR)
3.利用socket通信
python提供了两种通信方法:socket对象和文件类对象。
socket 对象提供了操作系统的 send, sendto, recv, recvfrom 调用的接口。
文件类对象则提供了 read, write readline 等python接口。
相关模块
select模块
select-在单线程网络服务中器程序中,管理多个套接字连接
select的原型为(rlist,wlist,xlist[,timeout]),其中rlist是等待读取的对象,wlist是等待写入的对象,xlist是等待异常的对象,最后一个是可选对象,指定等待的时间,单位是s. select方法的返回值是准备好的对象的三元组,若在timeout的时间内,没有对象准备好,那么返回值将是空的列表。
它采用的是轮询的方式来实现异步通信的。
猜你喜欢
- 2025-06-13 ScalersTalk 成长会 Python 小组第 9 周学习笔记
- 2025-06-13 Python开发爬虫的常用技术架构(python常用爬虫模块)
- 2025-06-13 python yield -- 生成器(python3 生成器)
- 2025-06-13 Python开发必备:自定义JSON编码器完全指南
- 2025-06-13 基于 Python 的 PLC 监控系统深度开发
- 2025-06-13 用Python演示ARP攻击的过程及应对办法
- 2025-06-13 Python语言有哪些特点 怎么能学好Scrapy框架
- 2025-06-13 蓝桥杯备考冲刺必刷题(Python) | 143 饮料换购
- 2025-06-13 轻松转换:Python程序将文本转为摩尔斯电码
- 2025-06-13 python 中如何针对于各种文件类型进行加密?
- 266℃Python短文,Python中的嵌套条件语句(六)
- 265℃python笔记:for循环嵌套。end=""的作用,图形打印
- 264℃PythonNet:实现Python与.Net代码相互调用!
- 259℃Python实现字符串小写转大写并写入文件
- 258℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 118℃原来2025是完美的平方年,一起探索六种平方的算吧
- 98℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 92℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
-
- Python中怎么给属性增加类型检查或合法性验证?
- 如何把python绘制的动态图形保存为gif文件或视频
- Python XOR异或 操作(python异或函数)
- 每天学点Python知识:使用制表符或换行符来添加空白
- Python3+ 变量命名全攻略:PEP8 规范 + 官方禁忌 + 实战技巧,全搞懂!
- python之类的定义和对象创建篇(如何在python中定义一个属于对象的数据成员?)
- Python函数调用常见的8个错误及解决方案
- Python学不会来打我(30)python模块与包详解
- 《防秃指南:Python高频考点串烧(附翻车现场实录)》
- Python 面向对象:掌握类的继承与组合,让你的代码更高效!
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)