c/s架构简单介绍

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

简单理解一下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客户端:

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)
View Code

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

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()
View Code

你可能感兴趣的:(c/s架构简单介绍)