单进程_非阻塞并发服务器

单进程_非阻塞并发服务器

多线程表明:IIS服务器python

多进程表明: Apache服务器服务器

子线程共享主线程的变量,因此主线程中不能关闭new_socket.close(),不然子线程也会断开链接多线程

上代码:并发

from socket import *


def main():
    # 建立对象
    tcp_server = socket(AF_INET, SOCK_STREAM)
    # 绑定地址
    tcp_server.bind(('', 8888))
    # 将主动模式设置为被动模式
    tcp_server.listen(5)
    # 设置为非阻塞模式
    tcp_server.setblocking(False)
    input_server = [tcp_server]
    while True:
        for tcp_socket in input_server:
            # 当为初始对象时,建立新的链接对象
            if tcp_socket == tcp_server:
                try:
                    # 建立新的链接对象
                    new_socket, client_info = tcp_socket.accept()
                    # 设置为非阻塞模式
                    new_socket.setblocking(False)
                    # 将新的对象添加至列表
                    input_server.append(new_socket)
                except:
                    pass
                else:
                    print(f'来自:{client_info[0]} 链接成功')
            else:
                try:
                    # 接收数据
                    raw_data = tcp_socket.recv(1024)
                    if raw_data:
                        print(f'接收到数据:{raw_data.decode("gb2312")}')
                    else:
                        print('客户端已断开!')
                        # 关闭链接
                        tcp_socket.close()
                        # 移除列表中
                        input_server.remove(tcp_socket)
                except:
                    pass


if __name__ == '__main__':
    main()

效果: 多个客户端访问服务端时,互不影响,可通知进行通信。app

阻塞型: 同一时刻只能有一个进行通信,其余的的链接将以排队方式进行阻塞。socket

相关文章
相关标签/搜索