开发者社区> 余二五> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
python--分支流程
1.分支结构 1.1单分支结构 如果......那么......否则...... 如果天气好,那么就出去玩,否则就宅在家里 分支结构:在程序运行过程中需要进行条件判断,根据结果分不同情况执行响应的代码 # 伪代码 if 判断条件: 执行语句1 else: 执行语句2 例: if 天气好: 出去玩 else: 在家待着 例:输入一个数字,判断该数字是不是7的倍数 num=int(input('请输入一个数字:')) if num%7==0: print('{}是7的倍数'.format(num)) else: print('{}不是7的倍数'.format(num) 1.2多分支结构 输入分数,
52 0
完整数据分析流程:Python中的Pandas如何解决业务问题
数据分析师用得最多的模块非Pandas莫属,如果你已经在接触它了,不妨一起来通过完整的数据分析流程,探索Pandas是如何解决业务问题的。
94 0
python 基础 字符串烧烤流程
python 基础 字符串烧烤流程
36 0
python接口自动化(三十六)-封装与调用--流程类接口关联续集(详解)
上一篇已经给大家都介绍过了流程类接口关联,但是由于博客的登录机制改变,所以没有办法给小伙伴们实战演练一下,那么这篇就按照上一篇计划的用jenkins来给小伙伴们演示一下流程类接口的封装和调用,其实很简单,就是用上一篇和前边这篇传送门的代码稍稍修改即可。不知道你自己练习了么,如果练习了,可以看看和我有什么不同,没练习的看看自己思路和我有啥不一样。好了废话少说进入主题
91 0
python接口自动化(三十五)-封装与调用--流程类接口关联(详解)
流程相关的接口,主要用 session 关联,如果写成函数(如上篇),s 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便。在这里我们还是以博客园为例,带着小伙伴们实践一下。
155 0
python数据分析-整个学习流程
python数据分析-整个学习流程
96 0
Python对象的创建流程
Python对象的创建流程自制脑图 类是一个用来创建对象的对象,类是 type 类型的对象,定义类实际上就是定义了一个 type 类型的对象。
32 0
一文全览机器学习建模流程(Python代码)
随着人工智能时代的到来,机器学习已成为解决问题的关键工具。我们接下来会详细介绍机器学习如何应用到实际问题,并概括机器学习应用的一般流程。
297 0
(三) Python程序的基本控制流程
(三) Python程序的基本控制流程
80 0
+关注
余二五
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
双剑合璧-Python和大数据计算平台的结合
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载