栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python 使用tcp协议实现web服务器(五) 单进程单线程非阻塞实现并发web服务器

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python 使用tcp协议实现web服务器(五) 单进程单线程非阻塞实现并发web服务器

文章目录
      • 摘要
      • 前置知识
      • python代码

摘要

使用python 基于tcp协议开发http web服务器(五)。

主要实现思想:将服务器和与客户端连接的套接字都转为非阻塞模式,然后通过不断循环,在一次循环里面,先检测是否有新客户端来连接,有的话就会返回一个新的套接字,将这个新的套接字加入到一个列表后,然后再遍历这个列表,得出目前的所有连接,一个一个的查看有没有发送过来数据,有数据过来则进一步处理。如果客户端关闭连接,就会返回None,紧接着就从列表中删除这个连接就行了

前置知识

这些都是一些基础知识,论坛里面都有写的很好的教程。

  • tcp协议
  • socket
python代码
import socket
from datetime import datetime

def main():
    """仅使用单进程、单线程来模拟实现并发http web服务器"""
    # 创建tcp套接字
    tcp_service_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_service_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 绑定ip和端口
    tcp_service_socket.bind(("192.168.0.107", 8080))
    # 将套接字从主动转为监听
    tcp_service_socket.listen(124)
    # 将套接字设为非阻塞
    tcp_service_socket.setblocking(False)

    # 用来存储连接的客户端
    client_socket_list = list()
    while True:
        try:
            # 看看有没有新客户端来连接,现在是非阻塞模式,没有新连接会抛出异常
            client_socket, client_addr = tcp_service_socket.accept()
        except Exception as e:
            # 没有新连接到来
            print("没有新的客户端连接")
        else:
            # 将与客户端连接的套接字也转为非阻塞
            client_socket.setblocking(False)
            # 将连接存入列表中
            client_socket_list.append(client_socket)

        # 遍历列表,逐个看看有没有发送数据过来
        for index, client_socket in enumerate(client_socket_list):
            try:
                # 看看有没有数据,没有则抛出异常,客户端调用close这里返回None
                recv_data = client_socket.recv(1024)
            except Exception as e:
                print("{} 客户端{}没有发送数据".format(datetime.now(), index+1))
            else:
                if recv_data:
                    # 发送了数据,进行下一步处理
                    print("客户端发送:", recv_data)
                    break
                else:
                    # recv_data是None,说明客户端已经调用close,关闭连接
                    # 从列表中删除这个套接字
                    client_socket_list.remove(client_socket)


if __name__ == "__main__":
    main()

建了一个python交流群,要是大家有疑问或者想交流的,欢迎进群交流,QQ群号码:891938703

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/950092.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号