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

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

多线程代表:IIS服务器

多进程代表: 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()

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

阻塞型: 同一时刻只能有一个进行通讯,其他的的连接将以排队方式进行阻塞。

转载于:https://my.oschina.net/u/3978509/blog/2988727

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值