• 第二十六天- 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()
  • 相关阅读:
    HttpURLConnection中使用代理(Proxy)及其验证(Authentication)
    Java获取随机数的几种方法
    史上最全的java随机数/字符串生成算法(转)
    httpClient中的三种超时设置小结
    几个性能测试工具
    硬件知识
    北风风hadoop课程体系
    IT大数据服务管理高级课程(IT服务,大数据,云计算,智能城市)
    .net framework client profile
    Resharper中注释代码的快捷键
  • 原文地址:https://www.cnblogs.com/xi1419/p/10004676.html
Copyright © 2020-2023  润新知