阻塞IO,非阻塞IO,IO多路复用模型-LMLPHP

阻塞IO,非阻塞IO,IO多路复用模型-LMLPHP

#服务端
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
while True:
    conn, address = sk.accept()
    while True:
        ret = conn.recv(1024)
        print(ret)
        inp = input('>>>')
        conn.sendall(inp.encode('utf-8'))
        # conn.sendall(bytes(inp, 'utf-8'))
#客户端
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
    inp=input('>>>>')
    sk.sendall(bytes(inp,'utf-8'))
    data=sk.recv(1024)
    print(str(data,'utf-8'))

阻塞IO,非阻塞IO,IO多路复用模型-LMLPHP

阻塞IO,非阻塞IO,IO多路复用模型-LMLPHP

#非阻塞IO进行recvform系统调用,会马上得到一个结果,如果结果是一个error(异常处理)
# 此时证明数据还未准备好,在等在下次进行recvform系统调用的期间,进程可以做其他事情
#这个过程非阻塞将整片时间片分成N多小阻塞,循环往复的进行recvform的系统调用

#服务端
import time
import socket
import os
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# sk.setsockopt
sk.bind(('127.0.0.1',8080))
sk.listen(5)
sk.setblocking(False)
while True:
    try:
        print('waiting client connection.......')
        conn,address =sk.accept()
        # print(os.getpid())
        print('++++',address)
        ret = conn.recv(1024) #系统级内核数据拷贝到用户级内存
        print(ret)
        conn.close()
    except Exception as e:
        print(e)
        time.sleep(4)#在此期间进程可以做其他任务
#客户端
import time
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
while True:
    sk.connect(('127.0.0.1',8080))
    print('hello')
    sk.sendall(b'hello')
    time.sleep(2)
    break

阻塞IO,非阻塞IO,IO多路复用模型-LMLPHP

阻塞IO,非阻塞IO,IO多路复用模型-LMLPHP

#select的使用#服务端
import socket
import select
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen(5)
sk.setblocking(False)
inputs=[sk,] #监听一个活动对象的列表
while True:
    r,w,e=select.select(inputs,[],[],5) #哪个对象活动了,r就会被选出来
    print('可活动的列表长度%s' % len(inputs))
    print('活动的对象只有%s个' % len(r))
    # print(type(r))
    for obj in r:
        if obj==sk:
            conn,add=obj.accept()
            print('conn:',conn)
            inputs.append(conn) #客户端的套接字对象放入活动列表中
            print('append之后<<<',r)
        else:
            data_byte=obj.recv(1024)
            print(str(data_byte,'utf-8'))
            if not data_byte:
                inputs.remove(obj)
                continue
            inp=input('回答%s >>>' % inputs.index(obj))
            obj.sendall(bytes(inp,'utf-8'))
    print('结尾>>>',r)
#客户端
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))

while True:
    inp=input('>>>>')
    sk.sendall(bytes(inp,'utf-8'))
    data=sk.recv(1024)
    print(str(data,'utf-8'))

参考资料:http://www.cnblogs.com/Eva-J/articles/8324837.html

05-07 15:38