Python 学习笔记 - socket(基本原理和流程)

简介:

在学Python之前,先复习一下网络的基本概念。


比如TCP/IP 4层模型,最上面的应用软件发送数据包,数据包在运输层加上TCP或者UDP的报头,然后在网络层加上IP的报头,然后在数据链路层根据ethernet协议分割成帧,每个帧TCP的最大数值为1500个字节,因此一个3200字节的包可以被分割成3个帧,然后依次从物理层发通过高低电压(对应0和1的二进制)发送出去。接收方通过同样的方式逆向的组合帧,然后依次去掉每一层的报文,最后获得数据。

wKiom1f15M7w8o9XAAC-7CQftrA845.png




对于程序开发人员而言,如果直接和每一层的协议打交道会非常麻烦,所幸有了socket这样一个抽象的接口,可以通过socket来进行网络通信的编程。


wKiom1f15MyAyPwHAADin_a--Yc951.png


Socket的基本流程如下所示

wKioL1f15M3ge-7NAADdTVJsg58480.png



简单的理解一下基本函数:

socket()因为socket的本质就是一个特殊的文件,这个相当于普通文件的open操作。打开的时候 可以指定IP地址类型,TCP或者UDP等等;

bind()绑定端口和IP地址

listen()指定backlog的数目,即可以排队连接的最大个数。

accept()可以监听指定的socket地址,阻塞直到有客户端发送请求连接

connect()客户端可以发送请求,连接到服务器

read()读取数据

write()发送数据

close()双方可以随时终止连接


其他函数的具体解释可以参考

http://www.cnblogs.com/wupeiqi/articles/5040823.html


为了更好的理解socket的连接和断开,我们需要了解TCP的握手和断开的流程。


TCP 3次握手连接


wKioL1f16mOANLG2AAAsd3LsnUY895.png


  1. 当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;

  2. 服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;

  3. 客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。



TCP 4次分手断开连接


wKiom1f16mLi8EV7AAAupagSLDU546.png


  1. 某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;

  2. 另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;

  3. 一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;

  4. 接收到这个FIN的源发送端TCP对它进行确认


下面看个简单的例子:


server.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import  socket
ip_port = ( '127.0.0.1' , 5555 )
s = socket.socket()
s.bind(ip_port)
s.listen( 5 )
conn,addr = s.accept()
while  True :
     try :
         recv_data = conn.recv( 1024 )
         if  str (recv_data,encoding = 'utf-8' ) = = 'exit' : break
         print ( str (recv_data,encoding = 'utf8' ))
         send_data = recv_data.upper()
         conn.send(send_data)
     #如果客户端断开连接,服务器会抛出异常,自动停止
     except  Exception as ex:
         break
conn.close()


client.py

1
2
3
4
5
6
7
8
9
10
11
12
13
import  socket
ip_port = ( '127.0.0.1' , 5555 )
s = socket.socket()
s.connect(ip_port)
while  True :
     data = input ( '>>' ).strip()
     if  len (data) = = 0 : continue
#如果直接输入空格或者回车,直接会卡住,因为服务器方面recv不会接受空值,会导致阻塞
     s.send(bytes(data,encoding = 'utf8' ))
     if  data = = 'exit' : break
     recv_data = s.recv( 1024 )
     print ( str (recv_data,encoding = 'utf8' ))
s.close()


结果如下:

客户端效果

1
2
3
4
5
6
7
8
"C:\Program Files\Python3\python.exe"  C: / Users / yli / pycharmprojects / Exercise / week9 / client1.py
>>aaa
AAA
>>bbb
BBB
>>Exit
EXIT
>>exit





本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1858942,如需转载请自行联系原作者

目录
相关文章
|
8月前
|
数据可视化 关系型数据库 MySQL
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
本文详解基于Python的电影TOP250数据可视化大屏开发全流程,涵盖爬虫、数据存储、分析及可视化。使用requests+BeautifulSoup爬取数据,pandas存入MySQL,pyecharts实现柱状图、饼图、词云图、散点图等多种图表,并通过Page组件拖拽布局组合成大屏,支持多种主题切换,附完整源码与视频讲解。
803 4
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
|
8月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
9月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
9月前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
2367 0
JSON 监控 API
366 0
|
10月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
1664 1
|
10月前
|
设计模式 算法 大数据
Python流程控制:让代码按你的节奏跳舞
Python流程控制是编程核心,通过if条件判断、for循环与while循环,控制代码执行顺序与逻辑分支。它帮助开发者实现智能决策、重复任务处理与交互式应用,是编写高效、清晰程序的关键。掌握这三大控制结构,将显著提升代码逻辑与程序性能。
316 0
|
11月前
|
数据采集 数据可视化 搜索推荐
Python数据分析全流程指南:从数据采集到可视化呈现的实战解析
在数字化转型中,数据分析成为企业决策核心,而Python凭借其强大生态和简洁语法成为首选工具。本文通过实战案例详解数据分析全流程,涵盖数据采集、清洗、探索、建模、可视化及自动化部署,帮助读者掌握从数据到业务价值的完整技能链。
1225 0
|
JSON 算法 API
1688商品详情API实战:Python调用全流程与数据解析技巧
本文介绍了1688电商平台的商品详情API接口,助力电商从业者高效获取商品信息。接口可返回商品基础属性、价格体系、库存状态、图片描述及商家详情等多维度数据,支持全球化语言设置。通过Python示例代码展示了如何调用该接口,帮助用户快速上手,适用于选品分析、市场研究等场景。
|
数据采集 机器学习/深度学习 数据挖掘
Python爬虫生成CSV文件的完整流程
Python爬虫生成CSV文件的完整流程

推荐镜像

更多