單進程_非阻塞併發服務器

單進程_非阻塞併發服務器

多線程表明: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

相關文章
相關標籤/搜索