day9 IO多路复用

参考:http://www.cnblogs.com/wupeiqi/articles/5040823.html

 

SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端。即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求。

 

IO多路复用server端:

import socket
import select

# IO多路复用:8002,8001
#
############################### 基于select实现服务端的“伪”并发 ###############################
sk1 = socket.socket()
sk1.bind(('127.0.0.1',8001,))
sk1.listen(5)

sk2 = socket.socket()
sk2.bind(('127.0.0.1',8002,))
sk2.listen(5)
inputs = [sk1,sk2,]
w_inputs = []
while True:
    # IO多路复用,同时监听多个socket对象
    #    - select,内部进行循环操作(1024)  主动查看
    #    - poll, 内部进行循环操作         主动查看
    #    - epoll,                        被动告知
    r,w,e = select.select(inputs,w_inputs,inputs,0.05)
    # r = [sk2,]
    # r = [sk1,]
    # r = [sk1,sk2]
    # r = []
    # r = [conn,]
    # r = [sk1,Wconn]
    #######?
    for obj in r:
        if obj in [sk1,sk2]:
            # 新连接捡来了...
            print('新连接来了:',obj)
            conn,addr = obj.accept()
            inputs.append(conn)
        else:
            # 有连接用户发送消息来了..
            print('有用户发送数据了:',obj)
            try:
                data = obj.recv(1024)
            except Exception as ex:
                data = ""
            if data:
                w_inputs.append(obj)
                # obj.sendall(data)
            else:
                obj.close()
                inputs.remove(obj)
                w_inputs.remove(obj)

    for obj in w:
        obj.sendall(b'ok')
        w_inputs.remove(obj)

 

client 端1:

import socket

client = socket.socket()
client.connect(('127.0.0.1',8001,))

while True:
    v = input('>>>')
    client.sendall(bytes(v,encoding='utf-8'))
    ret = client.recv(1024)
    print('服务器返回:',ret)

client 端2:

import socket

client = socket.socket()
client.connect(('127.0.0.1',8002,))

while True:
    v = input('>>>')
    client.sendall(bytes(v,encoding='utf-8'))
    ret = client.recv(1024)
    print('服务器返回:',ret)

 

posted on 2018-03-30 18:09  李永山  阅读(142)  评论(0编辑  收藏  举报

导航