c/s架构即客户端/服务端架构(想广义点)
学习socket(套接字)是为了c/s架构服务的,而这之前要学ois七层(相当于全世界人想通讯必须规定用英语)

简单理解一下ois七层(也就是一种协议,世界上所有计算机中的不同应用程序之间的一种通用交流语言):
物理层,数据链路层,网络层,传输层,(会话层,表示层,应用层)
举个例子,首先物理层很好理解,是通信的介质(电缆,线路,无线等等)
假设将网络通讯比作不同教室之间人的通讯,原始的人与人之间用吼(即广播),只要知道每个人名字(MAC地址)吼一声就可以。
计算机A与计算机B通讯,计算机A产生一串0101,没有任何意义,数据链路层将它们分组,附上MAC地址,吼!!!原则上,如果世界上所有计算机在一个教室中,到这一层,问题解决。
可是实际不可能这样,没这么大的教室,它们在不同的教室中。所以如果A,B不在同一个教室,首先还得知道它们所在的教室号,这时候网络层诞生,IP地址(协议)出现。
有了这两个,A,B通讯没问题了。可是我想要的是计算机A上的QQ与计算机B上面的QQ通讯,而不是与暴风什么的。所以还得锁定电脑上的不同程序,而每个程序与端口绑定,基于端口有TCP/UDP协议。
(因为IP是绑定在网卡上(mac)的,所以有时候说ip标识一台计算机是隐含了这层意思)
而每次这样通讯也太麻烦了,所以有人将TCP/IP协议封装,也就是将应用层(广义)以下封装,留几个接口调用,这样产生了socket协议。说白了基于socket协议也就是基于IOS协议

因此,客户端是一个程序,服务端是一个程序,两种通讯是要基于IOS协议,这里相当于简化,基于SOCKET(其实套接字有基于网络的,还有基于文件的,这里相当于基于网络的)



下面是一套简陋的客户端与服务端:
socket客户端:

CLOS架构优点 什么是clos架构_CLOS架构优点

1 import socket
 2 
 3 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 4 
 5 phone.connect(('127.0.0.1',8000))     # 拨电话 , IP只能绑定自己电脑上的IP
 6 
 7 # 必须二进制发收,不能直接发字符串
 8 phone.send('hello'.encode('utf-8'))    # 假设发一个hello
 9 data = phone.recv(1024)  # 接收服务器发来的消息
10 print('收到服务器的消息是: ',data)


CLOS架构优点 什么是clos架构_网络_02

这张图片帮助简单理解,下面是服务端:

CLOS架构优点 什么是clos架构_CLOS架构优点

1 import socket
 2 
 3 '''
 4 这段代码其实就是实现TCP的三次握手,数据通讯(每次发送都有ack回应,所以说是严密的),四次挥手
 5 '''
 6 
 7 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET是基于网络的意思
 8 phone.bind(('127.0.0.1',8000))  # IP+端口,这里的IP地址必须是自己电脑的IP
 9 phone.listen(5)    # 对多等多少个电话,相当于缓存大小
10 
11 print('---------------------------下面accept等待')
12 
13 conn, addr = phone.accept()         # 等电话,一旦有电话拿到电话连接与对方手机号,TCP背后做三次握手
14 
15 # 注意通讯是基于网络,也就是二进制通讯
16 msg = conn.recv(1024)           #收对方消息,1024代表收对方多少量消息
17 print('客户端发来的消息是: ',msg)
18 
19 
20 conn.send(msg.upper())                 # 发消息
21 
22 conn.close()
23 phone.close()