IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> python——tcp服务器与http第二弹 -> 正文阅读

[网络协议]python——tcp服务器与http第二弹

? 接前文,如果只在网页显示hahaha毫无意义,所以本文将在浏览器上显示网页

? ps:本文所用html文件来自度娘和b站的html源码。

1.主程序部分与前文没有差别,关键区别在于服务器的方法中。

2.浏览器请求网页时,在地址栏可以输入ip:port/xxx.html,其中xxx.html是可以缺省的项。而该项正是浏览器所请求的页面。

3.xxx.html在http请求报文中处于header的第一行,所以我们需要让服务器得到这个文件名,才能打开对应的文件。

4.获取文件名需要用到字符串的拆分,正则匹配。

5.打开文件需要捕获异常,防止服务器崩溃。

6.同时加入了多进程,实现多任务服务器

? ? ? ? 父子进程不共享全局变量,它们的服务套接字变量连接了os底层的同一个文件描述符,是硬连接,单独关闭一个并不影响另一个,只有都close才会彻底关闭套接字。

7.由于进程耗费资源大,在大量用户访问的情况下,协程更优

8.代码如下

import socket
import re
import gevent
from gevent import monkey


monkey.patch_all()


def serve_func(c_sock):
    # 接收服务器请求,并解码
    c_data = c_sock.recv(1024).decode("utf-8")
    # 拆分字符串,返回一个列表
    c_list = c_data.splitlines()
    # 取列表第0项进行正则匹配
    # 正则匹配含义:第一个字符集中除了/有至少一个字符
    # /之后,第二个字符集中除了空格可以有任意个字符
    # GET /xxx.html HTTP/1.1
    result = re.match(r"[^/]+(/[^ ]*)", c_list[0])  
    # 小括号是为了用group取出第一个小括号里的内容
    # 如果匹配变量为真
    if result:
        # 获取网页名称
        file_name = result.group(1)
        # 如果网页名称为空
        if len(file_name) == 0:
            # 返回一个固定网页,类似于首页
            file_name == /baidu.html
    # 尝试打开文件
    try:
        f = open("./Desktop" + file_name, "r", encoding=("utf-8"))
    # 打开失败返回404not found
    except:
        res = "HTTP/1.1 404 not found\r\n\r\n"
        res += "<h1>Not Found</h1>"
        c_sock.send(res.encode("utf-8"))
    # 打开成功则将文件内容发送给浏览器
    else:
        f_content = f.read()
        f.close()
        res2 = "HTTP/1.1 200 OK\r\n\r\n"
        res2 += f_content
        c_sock.send(res2.encode("utf-8"))
    # 关闭服务套接字
    t_sock.close()


def main():
    # 创建tcp套接字
    tcp_sock = socket.socket(socket.AF_INET, socket.STREAM)    
    # 绑定地址
    tcp_sock.bind(('', 54321))
    # 把套接字转为监听模式
    tcp_sock.listen(128)
    # 循环服务
    while True:
        # 使用accept等待客户端连接
        # 连接成功后返回服务套接字和客户端地址
        client_sock, client_add = tcp_sock.accept()
        # 创建协程
        p = gevent.spawn(serve, client_sock)
    # 关闭监听套接字 
    tcp_sock.close()


if __name__ == "__main__":
    main()

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 22:06:46  更:2021-11-14 22:07:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/3 8:41:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码