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

目录
相关文章
|
13天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
13天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
25天前
|
存储 C语言 Python
【Python】学习笔记day3
【Python】学习笔记day3
27 1
|
1月前
|
缓存 算法 测试技术
Python中的装饰器:原理与实践
【2月更文挑战第29天】 在Python编程领域,装饰器是一种强大的工具,它允许我们在不修改原始函数代码的情况下,增加或修改函数的行为。本文将深入探讨Python装饰器的概念、实现原理以及实际应用,帮助读者掌握这一技术并在实际项目中灵活运用。
|
6天前
|
程序员 索引 Python
Python 流程控制
Python 流程控制
18 0
|
7天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
7天前
|
Python
Python流程控制
Python流程控制
|
12天前
|
网络协议 Java API
Python网络编程基础(Socket编程)Twisted框架简介
【4月更文挑战第12天】在网络编程的实践中,除了使用基本的Socket API之外,还有许多高级的网络编程库可以帮助我们更高效地构建复杂和健壮的网络应用。这些库通常提供了异步IO、事件驱动、协议实现等高级功能,使得开发者能够专注于业务逻辑的实现,而不用过多关注底层的网络细节。
|
13天前
|
机器学习/深度学习 人工智能 算法
|
16天前
|
Python
Python网络编程基础(Socket编程)UDP服务器编程
【4月更文挑战第8天】Python UDP服务器编程使用socket库创建UDP套接字,绑定到特定地址(如localhost:8000),通过`recvfrom`接收客户端数据报,显示数据长度、地址和内容。无连接的UDP协议使得服务器无法主动发送数据,通常需应用层实现请求-响应机制。当完成时,用`close`关闭套接字。