返回固定数据

  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\r\n"

  response_header = "Server:Python-Web1.0\r\n"

  response_blank = "\r\n"

  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\r\n"

  response_header = "Server:Python-Web1.0\r\n"

  response_blank = "\r\n"

  # 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()

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

  request_list = request_data_str.split("\r\n")

  # 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\r\n"

  response_blank = "\r\n"

  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\r\n"

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

  response_content = response_content.encode()

  else:

  # 开始拼接响应数据

  response_line = "HTTP/1.1 200 OK\r\n"

  # 拼接响应头

  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)、获取请求行

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

  request_list = request_data_str.split("\r\n")

  # 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\r\n"

  # 3.2 响应头

  response_header = "Server:PythonWeb v1.0\r\n"

  # 3.3 空行

  response_blank = "\r\n"

  # 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\r\n"

  # 如果出错,设置响应的内容为 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()

python高级编程之 web静态服务器的更多相关文章

  1. Python Flask高级编程之从0到1开发《鱼书》精品项目 ☝☝☝

    Python Flask高级编程之从0到1开发<鱼书>精品项目 ☝☝☝ 一 .安装环境我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数 ...

  2. Python Flask高级编程之从0到1开发《鱼书》精品项目 ✍✍✍

    Python Flask高级编程之从0到1开发<鱼书>精品项目  一 .安装环境我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数据迁移 ...

  3. Python Flask高级编程之RESTFul API前后端分离精讲 (网盘免费分享)

    Python Flask高级编程之RESTFul API前后端分离精讲 (免费分享)  点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/12eKrJK ...

  4. Python Flask高级编程之从0到1开发《鱼书》精品项目

    Python Flask高级编程之从0到1开发<鱼书>精品项目     整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感 ...

  5. python并发编程之multiprocessing进程(二)

    python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. 系列文章 python并发编程之threading线程(一) python并 ...

  6. Web静态服务器

    Web静态服务器 编程微刊 Web静态服务器-1-显示固定的页面 #coding=utf-8 import socket def handle_client(client_socket): " ...

  7. Python网络编程之TCP套接字简单用法示例

    Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...

  8. Nodejs实现web静态服务器对多媒体文件的支持

    前几天,一个同事说他写的web静态服务器不支持音视频的播放,现简单实现一下. 原理:实现http1.1协议的range部分. 其实这一点都不神秘,我们常用的下载工具,如迅雷,下载很快,还支持断点续传, ...

  9. Python 多进程编程之multiprocessing--Pool

    Python 多进程编程之multiprocessing--Pool ----当需要创建的子进程数量不多的时候,可以直接利用multiprocessing 中的Process 动态生成多个进程, -- ...

随机推荐

  1. CF308C-Sereja and Brackets-(线段树+括号匹配)

    题意:给出一段括号,多次询问某个区间内能匹配多少括号. 题解:线段树,结构体三个属性,多余的左括号l,多余的右括号r,能够匹配的括号数val. 当前结点的val=左儿子的val+右儿子的val+min ...

  2. node开发遇到类似:Error: ENOENT: no such file or directory, scandir 'D:\work\taro-components- ....... _node-sass@4.12.0@node-sass\vendor

    唯一的有参考价值的文章,https://www.cnblogs.com/milo-wjh/p/9175138.html 我可以负责任的说,以下的方法, npm rebuild node-sass 80 ...

  3. 4.通过HttpMethod执行不同的服务方法

    package Services import ( "context" "fmt" "github.com/go-kit/kit/endpoint&q ...

  4. 八大排序算法总结与java实现(转)

    八大排序算法总结与Java实现 原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 ...

  5. 使用docker部署nginx+tomcat架构

    架构说明: 使用nginx+tomcat实现动态/静态(资源请求)分离和负载均衡. 参考文档: https://www.runoob.com/docker/docker-tutorial.html 配 ...

  6. const 变量在多个文件共享,如何验证两种不同的方式下,编译器是否会在多个文件下建立多个副本

    对于const变量多个文件共享,当我们不希望编译器为每个文件分别生成独立的变量,而是像非常量对象一个,一处定义,多处声明并使用. 解决办法是,对于const变量,不管是声明还是定义都添加extern关 ...

  7. 应用JWT进行用户认证及Token的刷新

    本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新方案(ASP.NET Core 系列目录) 一.什么是JWT? JWT(json web token ...

  8. Django学习----js传参给view.py

    需求: 散点图中每选择一个点,获取到id之后传给view.py,根据这个id进行sql语句的查询. 问题: 要求实时查询 解决办法: ajax查询 js页面 .on("mousedown&q ...

  9. Solr7.x学习(7)-JAVA操作

    maven依赖 <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-sol ...

  10. spark 资源动态分配

    'spark.shuffle.service.enabled': 'true', 'spark.dynamicAllocation.enabled': 'false', , , , 'spark.sq ...