python中以解堵塞、长连接方式实现http服务器

Python-网络编程:一个简单的http server6(单进程单线程,非堵塞方式 并发 实现,长连接) https://www.bilibili.com/video/av64065585/?p=79 学习笔记 阅读详情

一、以解堵塞(非堵塞)、长连接的方式实现http的服务器
1、长连接:http 1.1版本
建立连接-------------->数据传输---------------->保持连接--------------->数据传输---------------->关闭连接…
2、短连接:http 1.0版本
建立连接-------------->数据传输---------------->关闭连接…

import socket
import re


def client_request(request_data):
    """浏览器的请求"""

    # 将浏览器的请求转换成列表
    request_data_line = request_data.splitlines()
    print(request_data_line)
    print("-" * 50)

    # 根据浏览器请求的路径响应对应的页面
    # file_name = ""
    rul = re.match(r"[^/]+(/[^ ]*)", request_data_line[0])  # [^/]:从左往右取,不是/都不取。  +:必须有/。  (/[^ ]*):从/开始取到空格
    if rul:
        file_name = rul.group(1)
        if file_name == "/":    # 如果请求没有指定要访问的页面,默认是/(/默认访问的就是主页)
            file_name = "/index.html"

        return file_name


def server_response(client_new, file_name):
    """服务器的响应:给浏览器的http格式的数据(header和body)"""

    # body:响应的是一个主页
    try:
        f = open("./html"+file_name, "rb")
    except:
        response_header = "HTTP/1.1 404 NOT FOUND \r\n"
        response_header += "\r\n"
        response_header += "file not found"
        client_new.send(response_header.encode("utf-8"))
    else:
        # body:响应体的内容
        response_body = f.read()
        f.close()

        # header:响应头的内容
        response_header = "HTTP/1.1 200 OK \r\n"
        response_header += "Content-Length:%d\r\n" % len(response_body)      #
        response_header += "\r\n"

        # 将header和body响应给浏览器
        response = response_header.encode("utf-8") + response_body
        client_new.send(response)



def request_response(client_new, request_data):
    """浏览器的请求和服务器的响应"""

    # 调用请求的函数
    file_name = client_request(request_data)

    # 调用响应的函数
    server_response(client_new, file_name)


def main():

    # 创建套接字
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 端口重复使用
    tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # 绑定(bind)
    tcp_server.bind(("", 7896))

    # 监听(listen)
    tcp_server.listen(128)

    # 截堵塞(accept)
    tcp_server.setblocking(False)

    # 存储请求的浏览器(列表)
    client_box = list()

    while True:

        try:
            # 等待客户端的连接(accept)
            new, other = tcp_server.accept()
        except Exception as rel:
            # 没有请求
            pass
        else:
            # 截堵塞
            new.setblocking(False)
            # 有请求(有浏览器访问时添加到列表中)
            client_box.append(new)

        for client_new in client_box:

            try:
                request_data = client_new.recv(1024).decode("utf-8")
            except Exception as rul:
                # 没有请求过来
                pass
            else:
                # 有请求过来
                if request_data:
                    # 调用响应和请求函数
                    request_response(client_new, request_data)
                else:
                    # 如果没有请求过来,则关闭套接字,从列表中删除
                    client_new.close()
                    client_box.remove(client_new)

    # 关闭服务器套接字
    # tcp_server.close()


if __name__ == '__main__':

    main()
python并发web服务器实现 一、多进程完成web服务器实现 import socket import re import multiprocessing def response_request(new_socket): #接收浏览器请求 request = new_socket.recv(1024).decode("utf-8") request = request.splitlines() ... 阅读详情

相关推荐

FEniCS学习笔记01:centos7下通过conda安装FEniCSx0.7

2023年版本的Fenicsx0.7,官网推荐使用conda命令安装集成好的Python包,因此我们的安装思路是先安装Anaconda,再按照官网步骤安装Fenics。

huahua_xiao的博客 5056

[python][requests] https保持长连接 keep-alive

HTTPS (全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。

嵌入式单片机实验室 6131

大疆机场及无人机上云(航线规划、指令飞行...)

最近基于大疆上云api进行二次开发,后面将按照开发步骤对其进行说明!

资深三维GIS开发 5574

阻塞式Http Server与非阻塞式(异步)HttpServer 示例(基于apache http包构建)

基于阻塞式IO建立的Http Server    import java.io.FileNotFoundException;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.net.URL;import java.security.KeyManagementExce

网络 1680

工业音频故障检测:从CNN到Transformer的技术演进

音频信号处理是工业设备预测性维护的核心技术之一,通过分析设备运行时产生的声波特征实现故障预警。传统方法依赖梅尔频率倒谱系数(MFCC)等手工特征,而深度学习技术尤其是Transformer架构,通过自注意力机制突破了CNN在跨频段特征提取上的局限。Audio Spectrogram Transformer(AST)等先进模型在工业场景中展现出91.2%的高召回率,显著优于传统方案。这种非接触式监测技术结合边缘计算优化,已成功应用于石油化工、电力能源等领域,实现提前72小时预测轴承故障,单项目可避免数百万元的

weixin_30467861的博客 327

告别官方WebRTC的30G编译:我用libdatachannel给USB摄像头做了个轻量级网页监控

本文介绍了一种基于libdatachannel的轻量级WebRTC监控方案,通过USB摄像头实现实时视频推流。相比官方WebRTC库30GB的庞大编译体积,libdatachannel仅需几十MB,大幅简化了开发流程。文章详细讲解了从视频采集、FFmpeg编码到WebRTC传输的全过程,并提供了性能优化和部署方案,帮助开发者快速构建高效的网页监控系统。

weixin_29207533的博客 533

Java网络编程——创建非阻塞的HTTP服务器

Http简介、创建非阻塞的HTPP服务器

码说芯语的博客 1343

DC竞赛 国能日新功率预测题 rank21 解决方案(适合新手)

DataCastle国能日新光伏功率预测 数据异常处 本题在测试集中提供了时间、辐照度、风速、风向、温度、压强、湿度、实发辐照度8个特征,以及标签**实际功率**。 而在训练集中只有前七个特征,无实发辐照度。 策略 在观察了数据之后,我们确定实发辐照度是一个强力特征,于是我们采取了stacking的策略: 1. 第一次训练以实发辐照度为标签,预测 测试集的实发辐照度 2....

yyhhlancelot的博客 7294

Python实现HTTP服务器(六)长连接HTTP服务器

承接上文:https://blog.youkuaiyun.com/qq_32426313/article/details/104204568 HTTP长连接与短连接区别,参考https://www.jianshu.com/p/3fc3646fad80,一个网页中包含多个HTML,CSS,如果是短连接,访问一个页面时需建立多个TCP连接,而长连接只需要建立一次TCP即可。 因为socket是不关闭的,长连接...

你就是根号四的博客 2666

【无人机设计与控制】基于PID控制的四旋翼无人机系统Matlab仿真

本文设计并仿真了基于PID控制的四旋翼无人机系统。首先,建立了四旋翼无人机的数学模型,涵盖了无人机的动力学和控制系统。通过PID控制器对四旋翼的姿态和位置进行控制,以实现其稳定飞行。使用MATLAB/Simulink对该系统进行仿真,验证了PID控制算法在四旋翼控制中的有效性。仿真结果表明,PID控制能够较好地调节四旋翼的飞行姿态,并有效抑制外部干扰,使得无人机能够保持平稳飞行。

2401_84610415的博客 1804

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

3055

python的HttpServer出现socket.accept()阻塞卡死

最近想用python做一个我微信公众号的后台,结果发现,服务器刚启动的一个多小时微信发的消息是有回复,但过几个小时之后,所有给服务器发现的请求都没有回复了,找了两天问题,昨晚上还弄半夜3点。总算把问题给解决了。服务器用的是下边这个类:class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):和一个处理http各种do_请求的Handler:class

Mage的专栏 9762

[系统安全] 三十二.恶意代码检测(2)常用技术详解及总结

前文从产业界和学术界分别详细讲解恶意代码攻击溯源的相关知识,在学术界方面,用类似于综述来介绍攻击追踪溯源的不同方法;在产业界方面,主要参考李东宏老师从企业恶意样本分析的角度介绍溯源工作。这篇文章将详细总结恶意代码检测技术,包括恶意代码检测的对象和策略、特征值检测技术、校验和检测技术、启发式扫描技术、虚拟机检测技术和主动防御技术。希望这篇文章对您有所帮助,如果文章中存在错误、理解不到位或侵权的地方,还请告知作者与海涵。且看且珍惜,加油~

杨秀璋的专栏 1万+

python实现长连接_python中以解堵塞、长连接方式实现http服务器

一、以解堵塞(非堵塞)、长连接的方式实现http的服务器1、长连接:http 1.1版本建立连接-------------->数据传输---------------->保持连接--------------->数据传输---------------->关闭连接…2、短连接:http 1.0版本建立连接-------------->数据传输----------------...

weixin_39847732的博客 1031

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

长连接 单任务非堵塞 HTTP服务器的是实现

长连接 单任务非堵塞 HTTP服务器的是实现 经过晋升学习,有了新阶段的认识,实现了长连接 单任务非堵塞 HTTP服务器,下面是具体代码片段: import socket import re import time def server_c(new_socket, list_newsock): new_socket.setblocking(False) # 接受客户端发来的消息 try:...

Caiden_Michael 318

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python-socket :非堵塞-轮询-长连接HTTP简单服务器

socket套接字简介 支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。 简而言之两个应用进程之间网络通信可通过一个五元组socket实现,五元组格式如下: <协议,本地主机地址,本地端口,远程主机地址,远程端口> 详细科普请自行百度,废话不多说,直接开始程序解释理论 Pyt...

weixin_44093765的博客 840

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WEB静态服务器-使用单进程、线程、非堵塞实现长连接的http服务器

WEB静态服务器 单进程、线程、非堵塞、、长连接的http服务器 代码示例如下: import socket import re def service_client(new_socket, request): """为这个客户端返回数据""" # # 1、接收浏览器发送过来的请求,即http请求 # # GET / HTTP/1.1 # # .......

易编橙 · 终身成长社群,相遇已是上上签! 768

Python实现epoll版http服务器并实现长连接

epoll 是 Linux 平台下特有的一种 I/O 复用模型实现,epoll版http服务器实现原理类似于select版服务器,都是通过某种方式对套接字进行检验其是否能收发数据等。 select和poll中采用的都是轮询的方式进行检测,轮询的方式数据越多效率越低,而epoll中则通过事件通知的方式来进行检测,从主动的去轮询检测到等着需要处理的事件来通知,其效率要更高,同时没有上限,但是epoll...

darren573的博客 2241

单进程、单线程非堵塞长连接http服务器

本章时前面的综合案例编写。关键点 1、设置非堵塞 2、参数的传递 3、返回头的设置 response_header += "Content-Length:%d\r\n" % len(response_body) """单进程、单线程非堵塞长连接http服务器""" import socket import re def service_client(client_socket, request): """为客户端返回数据""" # 接收浏览器发送过来的请求 即 http 请求

m0_56880799的博客 218

python实现http请求并发_python实现并发http服务器

在HTTP协议1.0中是短连接,在1.1中是长连接什么是长连接和短连接。短连接:我们向服务器请求一个数据,先发送请求,再断开,如果再想要一个数据,就再次请求,断开。长链接:在一起连接和断开中,请求多个数据。我们上面的例子看是http1.1协议,是长链接,但是我们每次请求后都调用了close(),也就变成了短连接。长链接实现:import socketimport redef dump_data(c...

weixin_39876595的博客 255

python程序实现:长连接实现单进程,单线程,非堵塞,该程序作为服务器端,浏览器作为客户端。最好是两台电脑,虚拟机也算

print("长连接实现单进程,单线程,非堵塞") import socket import re def service_client(new_socket,request): request_lines = request.splitlines() print("") print(">"*20) print(request_lines) fil...

qq_40739261的博客 220

python网络基础之单进程单线程实现非堵塞的http服务器

用单进程/单线程我们可以实现一个返回网页页面的http服务器,其中主要的是把堵塞变为非堵塞 套接字.setblocking(False),来实现一个长连接 import socket import re import time def main(): # 创建套接字 socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_S...

yilv12123的博客 431

python3 web服务器_python3 简单web服务器

补充:tcp长连接和短连接长连接:客户端向服务器发起连接请求,服务器接收到请求回应给客户端,双方完成三次握手,然后客户端发送消息,服务端回应消息,每一次完成读写操作,套接字不不关闭,也就是连接不关闭,继续保持连接,等待下一次的读写操作,长时间之后客户端发起关闭请求。短连接:短连接则是一般只会在 client/server 间传递一次读写操作,一次读写操作之后就关闭连接,下一次的操通信则又从三次握手...

weixin_39611413的博客 697

单进程、单线程、非阻塞、长连接与epoll

长/短连接操作过程 短连接操作步骤:建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接 长连接操作步骤:建立连接——数据传输…(保持连接)…数据传输——关闭连接 单进程、单线程、长连接实现非阻塞 服务器在accept 等待客户端建立连接的时候,默认是堵塞的,我们只能为当前客户端服务结束之后才能为下一个客户端服务 如果为当前客户端服务时间较长,其他客户端就得等待很久,这会大大降...

qq_44739762的博客 481

单进程-单线程-长连接实现http服务器-轮询

#coding=utf-8 import socket import re import threading import multiprocessing import gevent from gevent import monkey monkey.patch_all() # 遇到阻塞自动切换协程,程序启动时执行monkey.patch_all()解决 def service_client(new_socket, request): '''为这个客户端返回数据''' # 1. .

weixin_42219287的博客 208

TCP服务器非堵塞面向对象长连接

面向对象封装,相关的函数放到一个对象中,便于管理def main(): # server_socket = init_server() # run_server(server_socket) tcp_server = WebServer() tcp_server.run_server() class WebServer(object): def run_...

Thanksbao的博客 386
上一篇: python中的命名规则
下一篇: mysql数据库中的SQL语句
Terminator_HWW
博客等级 码龄9年 17粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值