自定义socket 模拟B/S服务端

  • 2019 年 10 月 8 日
  • 筆記

目录

通过什么实现连接?

  • socket 套接字 位于应用层和传输层之间的虚拟层 一组接口进连接

B/S 客户端与服务端交互过程

socket server端 python代码 (静态html反馈)

    """      根据URL中不同的路径返回不同的内容--函数进阶版      返回独立的HTML页面      """        import socket        sk = socket.socket()      sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口      sk.listen()  # 监听          # 将返回不同的内容部分封装成不同的函数      def index(url):          # 读取index.html页面的内容          with open("index.html", "r", encoding="utf8") as f:              s = f.read()          # 返回字节数据          return bytes(s, encoding="utf8")          def home(url):          with open("home.html", "r", encoding="utf8") as f:              s = f.read()          return bytes(s, encoding="utf8")          # 定义一个url和实际要执行的函数的对应关系      list1 = [          ("/index/", index),          ("/home/", home),      ]        while True:          # 等待连接          conn, add = sk.accept()          data = conn.recv(8096)  # 接收客户端发来的消息          # 从data中取到路径          data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串          # 按rn分割          data1 = data.split("rn")[0]          url = data1.split()[1]  # url是我们从浏览器发过来的消息中分离出的访问路径          conn.send(b'HTTP/1.1 200 OKrnrn')  # 因为要遵循HTTP协议,所以回复的消息也要加状态行          # 根据不同的路径返回不同内容          func = None  # 定义一个保存将要执行的函数名的变量          for item in list1:              if item[0] == url:                  func = item[1]                  break          if func:              response = func(url)          else:              response = b"404 not found!"            # 返回具体的响应消息          conn.send(response)          conn.close()  
  • 提供响应的index页面 html代码
<!DOCTYPE html>  <html lang="en">  <head>      <meta charset="UTF-8">      <meta http-equiv="x-ua-compatible" content="IE=edge">      <meta name="viewport" content="width=device-width, initial-scale=1">      <title>index</title>  </head>  <body>  <div>这是index页面</div>  </body>  </html>
  • 提供响应的home页面 html代码
<!DOCTYPE html>  <html lang="en">  <head>      <meta charset="UTF-8">      <meta http-equiv="x-ua-compatible" content="IE=edge">      <meta name="viewport" content="width=device-width, initial-scale=1">      <title>home</title>  </head>  <body>  <div>这是home页面</div>  </body>  </html>
  • 浏览器访问 index页面
  • 浏览器访问 home页面
  • 输入无效页面结果
  • 网页能够正常显示,但是都是静态的。页面的内容都不会变化

socket server端 python代码 (动态html反馈)

#我们改一下代码,模拟一下动态网站。选择使用字符串替换来实现这个需求。(这里使用时间戳来模拟动态的数据)        """      根据URL中不同的路径返回不同的内容--函数进阶版      返回独立的HTML页面      """        import socket        sk = socket.socket()      sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口      sk.listen()  # 监听          # 将返回不同的内容部分封装成不同的函数      def index(url):          # 读取index.html页面的内容          with open("index.html", "r", encoding="utf8") as f:              s = f.read()          # 返回字节数据          return bytes(s, encoding="utf8")          def home(url):          with open("home.html", "r", encoding="utf8") as f:              s = f.read()          return bytes(s, encoding="utf8")          def timer(url):          import time          with open("time.html", "r", encoding="utf8") as f:              s = f.read()              s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S"))          return bytes(s, encoding="utf8")          # 定义一个url和实际要执行的函数的对应关系      list1 = [          ("/index/", index),          ("/home/", home),          ("/time/", timer),      ]        while True:          # 等待连接          conn, add = sk.accept()          data = conn.recv(8096)  # 接收客户端发来的消息          # 从data中取到路径          data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串          # 按rn分割          data1 = data.split("rn")[0]          url = data1.split()[1]  # url是我们从浏览器发过来的消息中分离出的访问路径          conn.send(b'HTTP/1.1 200 OKrnrn')  # 因为要遵循HTTP协议,所以回复的消息也要加状态行          # 根据不同的路径返回不同内容          func = None  # 定义一个保存将要执行的函数名的变量          for item in list1:              if item[0] == url:                  func = item[1]                  break          if func:              response = func(url)          else:              response = b"404 not found!"            # 返回具体的响应消息          conn.send(response)          conn.close()  
  • 提供响应的time页面 html代码
<!DOCTYPE html>  <html lang="en">  <head>      <meta charset="UTF-8">      <title>time</title>  </head>  <body>      <div>@@time@@</div>  <!--@@来标识要替换的元素-->  </body>  </html>
  • 执行效果 (刷新三次,时间是动态的)

小结 :

这是我们用socket模拟,基于BS框架下的 server端与browser端的交互,对于真实开发中的python web程序来说, 一般会分为两部分:服务器程序和应用程序。服务器程序负责对socket服务端进行封装,并在请求到来时, 对请求的各种数据进行整理。应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架, 例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合, 才能为用户提供服务。

作 者:郭楷丰