第二十六天- C/S架构 通信流程 socket
1.C/S架构
C/S架构:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可是物理层面)来划分的。这里客户端一般指需先安装再执行的应用程序,对操作系统依赖性较大;服务端即是这类程序对应的服务器。
B/S架构:browser/server,浏览器端与服务器端架构,也是C/S架构的一种,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。
2.通信流程
以京东为例:
第一步:打开浏览器,想要请求访问京东,在地址栏输入了网址:www.jd.com。(www.jd.com是域名就是一个IP地址的名称,IP地址不好记,所有有了域名。)
第二步:先将请求信息发给了交换机,然后交给了路由器,路由发给DNS服务器,通过DNS协议去找我们要访问的京东的IP地址
第三步:查到的京东服务器对应的IP地址之后,路由器通过路由协议找到一个路由转发的最优路径,将你的请求信息还送给这个IP地址的京东的路由器
第四步:京东的路由器发给了京东网站的服务器上
第五步:京东网站服务器按照来的时候的路径,在返回给你他自己的网站
第六步:当你打开浏览器时,系统自动给它一个编号,叫做端口号,当你电脑收到京东发的消息时,你的电脑通过端口号找浏览器,浏览器拿到京东的网站信息,然后将网站呈现在了自己的浏览器上
参考图:
补充:端口+IP能够确定一台电脑上的某一个应用程序
3.初识socket
socket 又称为套接字,看看基本格式:
server端:
1 import socket 2 sk = socket.socket() 3 sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 4 sk.listen() #监听链接 5 conn,addr = sk.accept() #接受客户端链接 6 ret = conn.recv(1024) #接收客户端信息 7 print(ret) #打印客户端信息 8 conn.send(b'hi') #向客户端发送信息 9 conn.close() #关闭客户端套接字 10 sk.close() #关闭服务器套接字(可选)
client端
1 import socket 2 sk = socket.socket() # 创建客户套接字 3 sk.connect(('127.0.0.1',8898)) # 尝试连接服务器 4 sk.send(b'hello!') 5 ret = sk.recv(1024) # 对话(发送/接收) 6 print(ret) 7 sk.close() # 关闭客户套接字
4.相关练习
# 1.
# server端:接收时间戳时间,转换成格式化时间
# client端:每隔10秒中把时间戳发给server端,time.time()
1 # server端 2 3 import socket 4 import time 5 6 server = socket.socket() # 创建socket对象 7 # ip_port = ('192.168.15.84',8001) # 创建ip+端口 8 ip_port = ('127.0.0.1',8001) 9 server.bind(ip_port) # 绑定端口 10 server.listen() # 开启监听 11 # 等待对方连接... 12 conn, addr = server.accept() # 拿到连接通道conn和通信地址addr(ip+端口) 13 14 while 1: 15 # 收消息 限制大小1024b 16 from_client_msg = conn.recv(1024) # 服务端(必须)通过conn通道接收消息 17 18 res_msg = time.gmtime(float(from_client_msg.decode('utf-8'))) # 还原成float后 再把时间戳结构化 19 print(time.strftime("%Y-%m-%d %H:%M:%S",res_msg)) # 格式化时间
# client
1 import socket 2 import time 3 4 5 client = socket.socket() 6 server_ip_port = ('127.0.0.1',8001) # 指定要连接到的地址 7 client.connect(server_ip_port) # 连接地址 8 9 while 1: 10 msg = time.time() 11 res_msg = str(msg).encode('utf-8') # 注意:直接float会报错 先转成字符串再编码!! 12 client.send(res_msg) # 给服务端发送消息 13 time.sleep(5)
# 2. 一直对话的程序
# server收一个发一个
# client发一个收一个
#server
1 import socket 2 3 server = socket.socket() 4 5 ip = ('127.0.0.1',8002) # IP随网络更换而改变 6 server.bind(ip) 7 server.listen() # 开启监听 8 conn,addr = server.accept() # 阻塞,等待连接,再解包(元祖)获得;连接通道conn和对方通信地址addr(ip+端口) 9 10 while 1: 11 from_client_msg = conn.recv(1024) # 接收消息 12 from_client_msg = from_client_msg.decode('utf-8') 13 print('来自忽悠的消息',from_client_msg) 14 if from_client_msg == 'bye': 15 break 16 17 msg = input(">>>>> ") 18 conn.send(msg.encode('utf-8')) 19 if msg == 'bye': 20 break 21 22 conn.close() 23 server.close()
# client
1 import socket 2 client = socket.socket() 3 4 server_ip = ('127.0.0.1',8002) 5 client.connect(server_ip) # 连接目标 6 7 while 1: 8 # 发消息 9 msg = input('>>>>> ') 10 client.send(msg.encode('utf-8')) # 发送内容必须是bytes 11 if msg == 'bye': 12 break 13 14 # 接消息 15 from_server_msg = client.recv(1024) # 通过client接收,限制1024b 16 from_server_msg = from_server_msg.decode('utf-8') 17 print('来自少北的消息:',from_server_msg) 18 if from_server_msg == 'bye': 19 break 20 21 client.close()