• python高级编程之 web静态服务器


      返回固定数据

      import socket

      def request_handler(new_client_socket):

      """ 响应客户端请求的核心函数 """

      request_data = new_client_socket.recv(1024)

      # 判断客户端是否已经断开链接

      if not request_data:

      print("客户端已经断开连接!")

      # 关闭当前连接

      new_client_socket.close()

      # 退出,代码不再向后执行

      return

      # 开始拼接响应数据

      response_line = "HTTP/1.1 200 OK "

      response_header = "Server:Python-Web1.0 "

      response_blank = " "

      response_content = "HelloWorld!"

      # 拼接响应头

      response_data = response_line + response_header + response_blank + response_content

      # 发送数据

      new_client_socket.send(response_data.encode())

      # 关闭socket

      new_client_socket.close()

      def main():

      # 创建套接字

      tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

      # 绑定IP 和端口

      tcp_server_socket.bind(("", 8080))

      # 设置套接字为被动套接字,主要接收客户端链接

      tcp_server_socket.listen(128)

      while True:

      # 接受客户端链接

      new_client_socket, ip_port = tcp_server_socket.accept()

      print("[新客户端上线]", ip_port)

      # 相应客户端请求,发送数据给客户端

      request_handler(new_client_socket)

      if __name__ == '__main__':

      main()

      返回固定页面

      import socket

      def request_handler(new_client_socket):

      """ 响应客户端请求的核心函数 """

      request_data = new_client_socket.recv(1024)

      # 判断客户端是否已经断开链接

      if not request_data:

      print("客户端已经断开连接!")

      # 关闭当前连接

      new_client_socket.close()

      # 退出,代码不再向后执行

      return

      # 开始拼接响应数据

      response_line = "HTTP/1.1 200 OK "

      response_header = "Server:Python-Web1.0 "

      response_blank = " "

      # response_content = "HelloWorld!"

      # 读取指定路径文件,并且返回

      with open("static/index.html", "rb") as file:

      # 读取文件的二进制数据

      response_content = file.read()

      # 拼接响应头

      response_data = (response_line + response_header + response_blank).encode() + response_content

      # 发送数据

      new_client_socket.send(response_data)

      # 关闭socket

      new_client_socket.close()

      def main():

      # 创建套接字

      tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

      # 设置地址重用

      tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

      # 绑定IP 和端口

      tcp_server_socket.bind(("", 8080))

      # 设置套接字为被动套接字,主要接收客户端链接

      tcp_server_socket.listen(128)

      while True:

      # 接受客户端链接

      new_client_socket, ip_port = tcp_server_socket.accept()

      print("[新客户端上线]", ip_port)

      # 相应客户端请求,发送数据给客户端

      request_handler(new_client_socket)

      if __name__ == '__main__':

      main()

      协程实现多任务服务器

      # 导入猴子补丁

      from gevent import monkey

      import socket

      import re

      import gevent

      # 让gevent 识别普通的耗时操作,并适时切换进程

      monkey.patch_all()

      def request_handler(new_client_socket):

      """ 响应客户端请求的核心函数 """

      request_data = new_client_socket.recv(1024)

      # 判断客户端是否已经断开链接

      if not request_data:

      print("客户端已经断开连接!")

      # 关闭当前连接

      new_client_socket.close()

      # 退出,代码不再向后执行

      return

      # 目的:得到 客户端 请求行

      # 对客户端请求的数据进行分析

      request_data_str = request_data.decode()

      # 根据” “ 分割请求头,得到存储每行请求数据的列表

      request_list = request_data_str.split(" ")

      # print(request_list)

      # 使用正则 取出 请求头中的 路径部分

      ret = re.search(r"s(.*)s", request_list[0])

      if not ret:

      print("用户请求报文格式错误!")

      new_client_socket.close()

      return

      # 得到路径

      path_info = ret.group(1)

      print("接收到用户请求:", path_info)

      # 设置默认请求页面为 index.html

      if path_info == "/":

      path_info = "/index.html"

      response_header = "Server:Python-Web1.0 "

      response_blank = " "

      try:

      # 读取指定路径文件,并且返回

      with open("static"+path_info, "rb") as file:

      # 读取文件的二进制数据

      response_content = file.read()

      except Exception as e:

      # 开始拼接响应数据

      response_line = "HTTP/1.1 404 Not Found "

      response_content = "Error !!! %s" % str(e)

      response_content = response_content.encode()

      else:

      # 开始拼接响应数据

      response_line = "HTTP/1.1 200 OK "

      # 拼接响应头

      response_data = (response_line + response_header + response_blank).encode() + response_content

      # 发送数据

      new_client_socket.send(response_data)

      # 关闭socket

      new_client_socket.close()

      def main():

      # 创建套接字

      tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

      # 设置地址重用

      tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

      # 绑定IP 和端口

      tcp_server_socket.bind(("", 8080))

      # 设置套接字为被动套接字,主要接收客户端链接

      tcp_server_socket.listen(128)

      while True:

      # 接受客户端链接

      new_client_socket, ip_port = tcp_server_socket.accept()

      print("[新客户端上线]", ip_port)

      # 相应客户端请求,发送数据给客户端

      # request_handler(new_client_socket)

      # 使用gevent协程处理客户端请求

      g1 = gevent.spawn(request_handler, new_client_socket)

      # 因为服务器一直在while True 不会退出,所以此处不用join一次

      # g1.join()无锡人流哪家好 http://www.wxbhffk.com/

      if __name__ == '__main__':

      main()

      面向对象封装

      # 导入模块

      import socket

      import re

      import gevent

      from gevent import monkey

      # recv() accept() time.sleep()

      monkey.patch_all()

      class HttpServer(object):

      def __init__(self):

      # 构建Tcp服务器

      # 1、创建tcp的socket

      tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

      # 设置地址重用

      tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

      # 2、绑定ip和端口

      tcp_server_socket.bind(("", 8080))

      # 3、把套接字由主动设置为被动,套接字只能用于建立连接

      tcp_server_socket.listen(128)

      self.tcp_server_socket = tcp_server_socket

      def start(self):

      # 改成 while True 的目的是,让服务器端一直接收客户端请求

      while True:

      # 4、等待接受客户端连接

      new_client_socket, ip_port = self.tcp_server_socket.accept()

      print("[新客户端来了]", ip_port)

      # 5、开始进行通信,响应客户端的请求

      # request_handler(new_client_socket)

      # 使用gevent 实现多任务

      g1 = gevent.spawn(self.request_handler, new_client_socket)

      @staticmethod

      def request_handler(new_client_socket):

      """完成对客户端的响应"""

      # 1、接受客户端发送的数据

      request_data = new_client_socket.recv(1024)

      # 2、判断数据是否为空,如果为空给出提示,程序退出

      if not request_data:

      print("客户端已断开连接!")

      new_client_socket.close()

      return

      # 返回指定页面

      # 1)、获取请求报文

      request_data_str = request_data.decode()

      # 2)、获取请求行

      # 把请求报文用 分割,得到一个列表,列表的每一项保存的是报文的每个协议项

      request_list = request_data_str.split(" ")

      # 3)、解析请求行中的路径部分

      ret = re.search(r"s(.*)s", request_list[0])

      if not ret:

      print("用户请求报文格式错误,请重试!")

      new_client_socket.close()

      return

      # 获取请求报文路径

      path_info = ret.group(1)

      # 设置默认的首页为 index.html

      if path_info == "/":

      path_info = "/index.html"

      print("正在请求:", path_info)

      # 3、拼接响应数据

      # 3.1 响应行

      response_line = "HTTP/1.1 200 OK "

      # 3.2 响应头

      response_header = "Server:PythonWeb v1.0 "

      # 3.3 空行

      response_blank = " "

      # 3.4 响应的内容

      # response_content = "HelloWorld!"

      # 客户端发请求,服务器段返回 指定的页面 static/index.html

      # 1) 打开文件 以读的方式打开

      try:

      with open("./static"+path_info, "rb") as file:

      # 2) 读取文件内容

      response_content = file.read()

      except Exception as e:

      # 请求页面不存在,需要做两件事情:1)服务器要捕获这个异常,否则服务器端就挂了 2)给客户单响应 没有找到请求页面

      response_line = "HTTP/1.1 404 Not Found "

      # 如果出错,设置响应的内容为 Error 信息

      response_content = "Error!!!~ %s " % str(e)

      # 编码

      response_content = response_content.encode()

      # 4、拼接响应数据,并且发送给客户端

      response_data = (response_line + response_header + response_blank).encode() + response_content

      new_client_socket.send(response_data)

      # 5、关闭套接字

      new_client_socket.close()

      def main():

      # 实例化对象

      httpserver = HttpServer()

      # 调用对象方法

      httpserver.start()

      # 定义程序主入口

      if __name__ == '__main__':

      main()

  • 相关阅读:
    php无限极分类
    如何使用百度地图
    如何在windows下用IDA优雅调试ELF
    [补] winpcap编程——EAPSOCKET实现校园网锐捷登录(mentohust)
    [补] winpcap编程——EAP协议与EAPSOCKET实现
    [补] windows C socket编程——大物实验预约
    [C++ Calculator 项目] 文件读入与可视化实现
    Area of Circle
    [C++ Calculator 项目] 基础运算实现
    [C++ Calculator 项目] 初试
  • 原文地址:https://www.cnblogs.com/djw12333/p/11459031.html
Copyright © 2020-2023  润新知