第二十六天- 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端:
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字
sk.listen() #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024) #接收客户端信息
print(ret) #打印客户端信息
conn.send(b'hi') #向客户端发送信息
conn.close() #关闭客户端套接字
sk.close() #关闭服务器套接字(可选)
client端
import socket
sk = socket.socket() # 创建客户套接字
sk.connect(('127.0.0.1',8898)) # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024) # 对话(发送/接收)
print(ret)
sk.close() # 关闭客户套接字
4.相关练习
# 1.
# server端:接收时间戳时间,转换成格式化时间
# client端:每隔10秒中把时间戳发给server端,time.time()
# server端 import socket
import time server = socket.socket() # 创建socket对象
# ip_port = ('192.168.15.84',8001) # 创建ip+端口
ip_port = ('127.0.0.1',8001)
server.bind(ip_port) # 绑定端口
server.listen() # 开启监听
# 等待对方连接...
conn, addr = server.accept() # 拿到连接通道conn和通信地址addr(ip+端口) while 1:
# 收消息 限制大小1024b
from_client_msg = conn.recv(1024) # 服务端(必须)通过conn通道接收消息 res_msg = time.gmtime(float(from_client_msg.decode('utf-8'))) # 还原成float后 再把时间戳结构化
print(time.strftime("%Y-%m-%d %H:%M:%S",res_msg)) # 格式化时间
# client
import socket
import time client = socket.socket()
server_ip_port = ('127.0.0.1',8001) # 指定要连接到的地址
client.connect(server_ip_port) # 连接地址 while 1:
msg = time.time()
res_msg = str(msg).encode('utf-8') # 注意:直接float会报错 先转成字符串再编码!!
client.send(res_msg) # 给服务端发送消息
time.sleep(5)
# 2. 一直对话的程序
# server收一个发一个
# client发一个收一个 #server
import socket
server = socket.socket()
ip = ('127.0.0.1',8002) # IP随网络更换而改变
server.bind(ip)
server.listen() # 开启监听
conn,addr = server.accept() # 阻塞,等待连接,再解包(元祖)获得;连接通道conn和对方通信地址addr(ip+端口)
while 1:
from_client_msg = conn.recv(1024) # 接收消息
from_client_msg = from_client_msg.decode('utf-8')
print('来自忽悠的消息',from_client_msg)
if from_client_msg == 'bye':
break
msg = input(">>>>> ")
conn.send(msg.encode('utf-8'))
if msg == 'bye':
break
conn.close()
server.close()
# client
import socket
client = socket.socket() server_ip = ('127.0.0.1',8002)
client.connect(server_ip) # 连接目标 while 1:
# 发消息
msg = input('>>>>> ')
client.send(msg.encode('utf-8')) # 发送内容必须是bytes
if msg == 'bye':
break # 接消息
from_server_msg = client.recv(1024) # 通过client接收,限制1024b
from_server_msg = from_server_msg.decode('utf-8')
print('来自少北的消息:',from_server_msg)
if from_server_msg == 'bye':
break client.close()
第二十六天- C/S架构 通信流程 socket的更多相关文章
- javaSE第二十六天
第二十六天 414 1:网络编程(理解) 414 (1)网络编程:用Java语言实现计算机间数据的信息传递和资源共享 414 (2)网络编程模型 414 (3)网络编程的三要素 ...
- IT第二十六天 - Swing、上周总结
IT第二十六天 上午 Swing 1.对于方法的参数如果是int数值类型,应该直接调用该类中的常量属性,而不应该直接填入数字 2.Toolkit类中定义的方法是可以直接访问本地计算机(操作系统)信息的 ...
- Python第二十六天 python装饰器
Python第二十六天 python装饰器 装饰器Python 2.4 开始提供了装饰器( decorator ),装饰器作为修改函数的一种便捷方式,为工程师编写程序提供了便利性和灵活性装饰器本质上就 ...
- 孤荷凌寒自学python第二十六天python的time模块的相关方法
孤荷凌寒自学python第二十六天python的time模块的相关方法 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 要使用time模块的相关方法,必须在文件顶端引用: import tim ...
- 第二十六天 蛰伏的Hibernate遇到春日的暖阳 —Spring MVC 集成Hibernate使用(一)
6月7日.晴."纷纷红紫已成尘,布谷声中夏令新. 夹路桑麻行不尽.始知身是太平人. " Hibernate和Spring的香艳相逢,不仅是Bean和Bean之间电光火 ...
- JavaScript(第二十六天)【表单处理】
为了分担服务器处理表单的压力,JavaScript提供了一些解决方案,从而大大打破了处处依赖服务器的局面. 一.表单介绍 在HTML中,表单是由<form>元素来表示的,而在JavaS ...
- (93)Wangdao.com_第二十六天_鼠标事件
鼠标事件 与鼠标相关的事件,继承了 MouseEvent 接口 分类: click 按下鼠标(通常是按下主按钮)时触发. mousedown 首先触发,mouseup 接着 ...
- c++第二十六天
p131~p135: 1.除非必要否则不使用后缀加加(减减),会有额外的性能开销. 2.混用解引用和递增运算符.*pointer++,后缀运算符优先于解引用运算符. 3.运算对象可按任意顺序求值,即使 ...
- Python - Socket网络编程 - 第二十六天
网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高 ...
随机推荐
- JavaScript 之基础知识
JavaScript 基础知识 JavaScript 是属于网络的脚本语言! JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用. JavaS ...
- JavaScript把函数作为另一函数的参数
首先说一下这个问题是怎么产生的:今天看排序算法,想要比较不同的排序算法的时间花费. 最简单的时间统计方法是在程序块开始和结束时分别计时,求一下时间差就能得出该段代码的耗时. 如: var foo = ...
- easyui datagrid里的复选框置灰方法
easyui datagrid里的复选框置灰方法: $('.datagrid input').prop('disabled',true);//复选框置灰
- 原生Js弹窗插件|web弹出层组件|对话框
wcPop.js 是一款基于原生javascript开发的前端 web版 弹窗组件,遵循原生 H5/css3/JS 的书写规范,简单实用.拿来即用(压缩后仅10KB).已经兼容各大主流浏览器.内含多种 ...
- (转)支持Multi Range Read索引优化
支持Multi Range Read索引优化 原文:http://book.51cto.com/art/201701/529465.htm http://book.51cto.com/art/2016 ...
- tensorflow进阶篇-3
#-*- coding:utf-8 -*- #Tensorflow的嵌入Layer import numpy as np import tensorflow as tf sess=tf.Session ...
- Liunx安装Git
环境:CentOS 6.5 min 安装git yum -y install gcc curl curl-devel zlib-devel openssl-devel perl cpio expat- ...
- #pragma的一些用法
1.#pragma message message 参数:Message参数能够在编译信息输出窗口输出相应的信息,这对于源代码的信息控制特别重要,其使用方法为: #pragma message(&qu ...
- 解决Nginx 504 Gateway Time-out问题
解决方案:在http里设置FastCGI相关参数,如: worker_processes 1; events { worker_connections 1024; } http { include m ...
- alloca() 是什么?为什么不提倡使用它?
在调用 alloca() 的函数返回的时候, 它分配的内存会自动释放.也就是说, 用 alloca 分配的内存在某种程度上局部于函数的 ``堆栈帧" 或上下文中. alloca() 不具可 ...