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,如需转载请自行联系原作者

目录
相关文章
|
4天前
|
BI 测试技术 索引
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)-1
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)
|
1天前
|
Python
GitHub爆赞!终于有大佬把《Python学习手册》学习笔记分享出来了
这份笔记的目标是为了给出一份比较精炼,但是又要浅显易懂的Python教程。《Python学习手册》中文第四版虽然比较简单,但是措辞比较罗嗦,而且一个语法点往往散落在多个章节,不方便读者总结。 我在做笔记时,将一个知识点的内容都统筹在一个章节里面,因此提炼性大大提高。而且还有《Python学习手册》中文第四版的翻译在某些章节(可能难度较大?)措辞可能前后矛盾。当知识点提炼之后就能够很快的找到一些难以理解的概念的上下文,方便吃透这些难点。
GitHub爆赞!终于有大佬把《Python学习手册》学习笔记分享出来了
这份笔记的目标是为了给出一份比较精炼,但是又要浅显易懂的Python教程。《Python学习手册》中文第四版虽然比较简单,但是措辞比较罗嗦,而且一个语法点往往散落在多个章节,不方便读者总结。 我在做笔记时,将一个知识点的内容都统筹在一个章节里面,因此提炼性大大提高。而且还有《Python学习手册》中文第四版的翻译在某些章节(可能难度较大?)措辞可能前后矛盾。当知识点提炼之后就能够很快的找到一些难以理解的概念的上下文,方便吃透这些难点。
|
3天前
|
存储 Linux Docker
python项目 以docker形式打包部署全流程
在很久很久以前,我已经听过Docker的大名,当时服务着急上线虽然考虑过用Docker来部署我的服务,但是因为赶期的原因放弃了。 这两天因为华为云服务器到期,而且阿里云服务器优惠力度特别大的原因,我要把华为云服务器里的工程迁移到阿里云。 迁移的过程中,大量的时间精力浪费在了重装python,加载依赖,迁移项目,配置端口等环境配置的工作上。 我在想,如果当时用了Docker部署,我至于受这气?
|
4天前
|
C语言 索引 Python
Python零基础入门-3 流程控制
Python零基础入门-3 流程控制
|
4天前
|
Python
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)-2
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)
|
4天前
|
数据可视化 开发者 Python
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)-1
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)
|
4天前
|
存储 API C语言
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)-2
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)
|
5天前
|
机器学习/深度学习 传感器 算法
基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
|
5天前
|
机器学习/深度学习 传感器 人工智能
敢不敢和AI比猜拳?能赢算我输----基于手势识别的AI猜拳游戏【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
敢不敢和AI比猜拳?能赢算我输----基于手势识别的AI猜拳游戏【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目