阻塞,非阻塞,IO多路复用

 
阻塞I/O模型(服务端):
from socket import *
server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1',8081))
server.listen(5)

while True:
    conn, addr = server.accept()
    print(addr)

    while True:
        try:
            data=conn.recv(1024)
            if not data:break
            conn.send(data.upper())
        except ConnectionResetError:
            break
    conn.close()

server.close()


阻塞I/O模型(客户端):
from socket import *
client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1',8081))

while True:
    msg=input('>>: ').strip()
    if not msg:continue
    client.send(msg.encode('utf-8'))
    data=client.recv(1024)
    print(data.decode('utf-8'))
===================================================
非阻塞I/O模型(服务端):
1 对cpu的占用率过多,但是是无用的占用
2 在连接数过多的情况下,不能及时响应客户的的消息
from socket import *
import time
server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1',8083))
server.listen(5)
server.setblocking(False)   #设置为False  #accept,recv 默认True(阻塞型)
conn_l=[]

while True:
    try:
        conn, addr = server.accept()
        conn_l.append(conn)
        print(addr)
    except BlockingIOError:
        print('干其他活去了',len(conn_l))
        # time.sleep(2)
        del_l = []
        for conn in conn_l:
            try:
                data=conn.recv(1024)
                if not data:
                    conn.close()
                    del_l.append(conn)
                    continue
                conn.send(data.upper())
            except BlockingIOError:
                pass
            except ConnectionResetError:
                conn.close()
                del_l.append(conn)

        for conn in del_l:
            conn_l.remove(conn)

非阻塞I/O模型(客户端):
from socket import *

client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1',8083))

while True:
    msg=input('>>: ').strip()
    if not msg:continue
    client.send(msg.encode('utf-8'))
    data=client.recv(1024)
    print(data.decode('utf-8'))
==============================================================
I/O多路复用(服务端):
from socket import *
import time
import select

server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1',8084))
server.listen(5)
server.setblocking(False)

read_l=[server,]
print('starting....')
while True:
    rl,wl,xl=select.select(read_l,[],[]) #read_l=[server,conn1,conn2,conn3]
    #rl=[server,conn2]

    # print('===>',rl)
    # print(rl[0] is server)

    for r in rl:
        if r is server:
            conn,addr=rl[0].accept() #conn,addr=server.accpet()
            print(addr)
            read_l.append(conn)
            # print(len(read_l))
        else:
            try:
                data=r.recv(1024)
                if not data:
                    r.close()
                    read_l.remove(r)
                    continue
                r.send(data.upper())
            except ConnectionResetError:
                r.close()
                read_l.remove(r)

I/O多路复用(客户端):
from socket import *

client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1',8084))

while True:
    msg=input('>>: ').strip()
    if not msg:continue
    client.send(msg.encode('utf-8'))
    data=client.recv(1024)
    print(data.decode('utf-8'))


依然是你 ---  胡彦斌


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值