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. # 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)) # 格式化时间
  1. # client
  1. import socket
  2. import time
  3.  
  4. client = socket.socket()
  5. server_ip_port = ('127.0.0.1',8001) # 指定要连接到的地址
  6. client.connect(server_ip_port) # 连接地址
  7.  
  8. while 1:
  9. msg = time.time()
  10. res_msg = str(msg).encode('utf-8') # 注意:直接float会报错 先转成字符串再编码!!
  11. client.send(res_msg) # 给服务端发送消息
  12. time.sleep(5)
  1.  
  2. # 2. 一直对话的程序
    # server收一个发一个
    # client发一个收一个
  3.  
  4. #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()
  1. # 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()

第二十六天- C/S架构 通信流程 socket的更多相关文章

  1. javaSE第二十六天

    第二十六天    414 1:网络编程(理解)    414 (1)网络编程:用Java语言实现计算机间数据的信息传递和资源共享    414 (2)网络编程模型    414 (3)网络编程的三要素 ...

  2. IT第二十六天 - Swing、上周总结

    IT第二十六天 上午 Swing 1.对于方法的参数如果是int数值类型,应该直接调用该类中的常量属性,而不应该直接填入数字 2.Toolkit类中定义的方法是可以直接访问本地计算机(操作系统)信息的 ...

  3. Python第二十六天 python装饰器

    Python第二十六天 python装饰器 装饰器Python 2.4 开始提供了装饰器( decorator ),装饰器作为修改函数的一种便捷方式,为工程师编写程序提供了便利性和灵活性装饰器本质上就 ...

  4. 孤荷凌寒自学python第二十六天python的time模块的相关方法

    孤荷凌寒自学python第二十六天python的time模块的相关方法 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 要使用time模块的相关方法,必须在文件顶端引用: import tim ...

  5. 第二十六天 蛰伏的Hibernate遇到春日的暖阳 —Spring MVC 集成Hibernate使用(一)

    6月7日.晴."纷纷红紫已成尘,布谷声中夏令新. 夹路桑麻行不尽.始知身是太平人. "        Hibernate和Spring的香艳相逢,不仅是Bean和Bean之间电光火 ...

  6. JavaScript(第二十六天)【表单处理】

    为了分担服务器处理表单的压力,JavaScript提供了一些解决方案,从而大大打破了处处依赖服务器的局面.   一.表单介绍 在HTML中,表单是由<form>元素来表示的,而在JavaS ...

  7. (93)Wangdao.com_第二十六天_鼠标事件

    鼠标事件 与鼠标相关的事件,继承了 MouseEvent 接口 分类: click        按下鼠标(通常是按下主按钮)时触发.        mousedown 首先触发,mouseup 接着 ...

  8. c++第二十六天

    p131~p135: 1.除非必要否则不使用后缀加加(减减),会有额外的性能开销. 2.混用解引用和递增运算符.*pointer++,后缀运算符优先于解引用运算符. 3.运算对象可按任意顺序求值,即使 ...

  9. Python - Socket网络编程 - 第二十六天

    网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高 ...

随机推荐

  1. jsp页面,jstl标签中的数据在<%%>java中使用

    可参考jsp的API隐式对象.. 这部分数据其实被保存在page域中,但jsp中如果使用java代码需要在特定的标签中<%%>,在这个标签中可使用的只有pageContext对象,所以可以 ...

  2. 字蛛fontSpider的使用

    字蛛官方文档 http://font-spider.org/index.html 首先安装全局包  npm install font-spider -g 然后下载字体 ,本次需要的是  "造 ...

  3. 布隆过滤器redis缓存

    Bloom Filter布隆过滤器算法背景如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定.链表.树.散列表(又叫哈希表,Hash table)等等数据结构 ...

  4. Python shutil模块(目录和文件操作)

    import shutil #导入shutil模块 copyfileobj方法 将类文件对象fsrc的内容复制到类文件对象fdst shutil.copyfileobj(fsrc, fdst[, le ...

  5. PL/SQL DEVELOPER数字超长显示了科学计数法

    问题: 最近在做项目中,ID使用了长整形,10进制数值大约长度17位,在pl/sql developer 上数值由科学计数法显示. 在查看时不是很方便,且数值进行了省略显示,不准确. 解决方法: 在t ...

  6. RxJava/RxAndroid 使用实例实践

    原文地址 RxAndroid Tutorial响应式编程(Reactive programming)不是一种API,而是一种新的非常有用的范式,而RxJava就是一套基于此思想的框架,在Android ...

  7. redis 安装 与错误解决办法

    redis 安装与安装中遇到的错误 redis 安装 wget http://download.redis.io/releases/redis-4.0.11.tar.gz .tar.gz cd red ...

  8. 使用fastjson进行转换

    package junit.test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; imp ...

  9. C#的Lambda表达式嵌套例子

    /* *curStatsResult是List<string>类型, *x.GetAllOsVersion()结果是string[]类型, *这里是先使用SelectMany()返回一个结 ...

  10. Mahout实战---运行第一个推荐引擎

    创建输入 创建intro.csv文件,内容如下 1,101,5.0 1,102,3.0 1,103,2.5 2,101,2.0 2,102,2.5 2,103,5.0 2,104,2.0 3,101, ...