Python高级编程day6非阻塞套接字与IO多路复用

本文介绍了套接字在程序间通信中的应用,包括TCP/IP协议、IP地址的概念,以及IPv4和IPv6的区别。详细讲解了服务器和客户端的套接字编程,展示了数据发送和接收的过程,并讨论了阻塞与非阻塞套接字以及并发与并行的概念。
摘要由CSDN通过智能技术生成

———————————————————————————————————————————

程序与程序之间靠什么通信?

答案是——套接字(socket)

应用A通过套接字将数据打包,再通过网络设备将数据包发送到应用B的位置。

再通过套接字将数据包进行解包。再将数据发送给应用B(让我们看到)。

 

在经过网络设备时,会经过七层模型(亦或者四层模型),

传输层是我们所需掌握的。

ip地址是网络层很重要的一个概念。

ip地址相当于电脑的身份证。每一台手机或者电脑都会分配一个ip地址。

---------------------------------------------------------------------------------------------------------------------------------

关于ip地址的进化史

1.ipv4是第一个被广泛应用的ip,IP是TCP/IP协议族中网络层的协议,是TCP/IP协议的核心协议。

2.ipv4的地址长度规定为32位,四段,每段8位且以点隔开,并以十进制形式表示。

故每段的数值范围为0~255,即最小的为0.0.0.0,最大为255.255.255.255。

3.由于ipv4位数使用地址资源被分配完,故产生了ipv6。

4.ipv6的 长度是ipv4的四倍,以十六进制形式表示,其被分为8段,每段以冒号隔开。

5.其中地址块127.0.0.1被保留作回环通信用。

0.0.0.0为任意使用。

ip是为了找到我们电脑的位置,那么端口就是为了找到我们的一个应用。(也相当于一个身份证)

TCP的四握三挥 

 

———————————————————————————————————————————

服务端

创建一个server(客户端文件)

当我们print打印输出之后:

这是一个由尖括号括起来的内容,它是我们的一个套接字对象。

family = AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, Proto=0

这段输出代码中的AF_INET表示ipv4.

当然,也可以直接写在括号中

客户端

client文件

这两个python文件就被连接起来了。

现在我们来将它运行……(开启顺序:先运行服务端server.py,再运行客户端client.py)

为什么拒绝了?

我们这样修改修改……

server作出如下修改 ↓

还是先运行服务端,再运行客户端……

开始运行服务端文件server.py时,输出如下↓

此时,再运行我们的客户端(client.py文件)↓

看似没有变化,但好在没有在报错了…

此时,我们再回到server.py文件时,我们发现下方多了一行由括号组成的套接字对象。

注意,客户端的端口号是随机的,多次运行client.py文件会返回给server.py不同的端口号。

532230——>55915

--------------------------------------------------------------------------------------------------------------------------------

那么,在套接字接收到了数据之后,能不能将数据给拿出来呢?

当然可以,括号括起来的内容就是一个元祖,我们可以进行元祖拆包。

先建立一个元祖拆包文件:

---------------------------------------------------------------------------------------------------------------------------------

按照这个:

第二行尖括号内容是套接字对象。

那么如何拿到client.py的数据 ('hello world') 呢?

加改两行代码(24 25)

接着,还是按照之前的操作,先sever再client。

运行效果如下图所示:

看,client的数据就被拿到了。

---------------------------------------------------------------------------------------------------------------------------------

那么,server如何向client发送数据呢??

首先,分别对server、client作出以下修改……

依旧是老样子,先运行server,再运行client。

运行结果:

这样就实现了服务端向客户端发送数据。

最后:我们要关闭服务端

写下如下代码:conn.close( )  #关闭套接字

                          server.close( )  # 关闭服务端

关闭顺序从小到大。

[注意以下情况]

———————————————————————————————————————————

但是,服务器是会有阻塞的。

当我们服务端创建了对等连接套接字之后……

当没有任何的客户端与服务端建立连接。

看此时,服务端还在运行,但始终没有输出结果。

而客户端此时已经结束运行了。

上述的情况就是阻塞。

发生上述有三种

第一:在没有客户与我连接的情况下,创建了对等连接套接字

那么,什么情况下才会使阻塞消失呢?

当客户端与服务端建立连接之后。

它才的阻塞会消失,运行才能正常结束。

第二:客户端与服务端建立连接,但是客户端一次性发送了十条数据。

如何解决阻塞呢?

———————————————————————————————————————————

基本认知

1.数据流

          一组有序的,有起始和结束的字节的‘数据序列’,可以被读取一次货少数几次的有序序列

          分类:

              输入流:读,从键盘或者文件中获取数据

              输出流:写,计算机像显示器或者打印机或者文件传入数据

              流的主语:计算机

   

2.IO

IO操作:信息交换的过程中对流进行数据的收发操作

IO解释:输入和输出

IO交互:

    用户空间:用户去操作的数据存放空间,存放的是用户存放的代码和数据,应用程序在运行的用户空间。

    内核空间:存放的是内核代码数据,保存操作系统驱动程序的数据,也就是操作系统是在内核空间去运行的。

    缓冲区:当我们去读取数据的时候会首先去判断这个缓冲区有没有缓冲数据,如果没有缓冲数据一般就会去磁盘里面拿。

 

非阻塞套接字:

服务端:

客户端:

输出结果:

———————————————————————————————————————————

并发与并行

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中国第一深情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值