———————————————————————————————————————————
程序与程序之间靠什么通信?
答案是——套接字(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交互:
用户空间:用户去操作的数据存放空间,存放的是用户存放的代码和数据,应用程序在运行的用户空间。
内核空间:存放的是内核代码和数据,保存操作系统和驱动程序的数据,也就是操作系统是在内核空间去运行的。
缓冲区:当我们去读取数据的时候会首先去判断这个缓冲区有没有缓冲数据,如果没有缓冲数据一般就会去磁盘里面拿。
非阻塞套接字:
服务端:
客户端:
输出结果:
———————————————————————————————————————————
并发与并行