IO多路复用例子

server端

#select 函数的简单示例
from socket import *
from select import *

server = socket() #创建套接字
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)  #设置监听
server.bind(('0.0.0.0',9999))
server.listen(5)
print("服务器已启动")

#定义三个列表,存放读,写,异常三类IO的列表
rlist = [server]
wlist = []
xlist = []
while True:
    rs,ws,xs = select(rlist,wlist,xlist)
    for r in rs:
        print("r=",r)
        if r is server:
            client,addr=server.accept()
            print("connect from:",addr)
            rlist.append(client)  #连接上后,再次出发IO则是读写数据,所以加到读列表中,当然也可以同时加到写列表中。
        else:
            data = r.recv(1024)
            if not data:
                rlist.remove(r)   #假定客户端发的数据则认为当前读操作结束时,移除。
                continue
            else:
                print("收到的数据:",data.decode())
                wlist.append(r)  #加到写列表
    for w in ws:
        w.send("test Msg ".encode())
        print("发送了消息")
        ws.remove(w)    #假定服务端发送一条数据后则认为当前写操作结束时,移除。
    for x in xs:
        pass

server.close()

client端

from socket import *

#创建tcp套接字
sockfd = socket()

#发起连接
server_addr = ('127.0.0.1',9999)
sockfd.connect(server_addr)

#消息收发
while True:
    data = input(">>")
    if not data:
        break
    sockfd.send(data.encode())
    data = sockfd.recv(1024)
    print("From server:",data.decode())

sockfd.close()

你可能感兴趣的:(网络编程)