Python IO多路复用之——select方案服务端和客户端代码【python源码详解】

准备文件:

    IO.py  服务端代码 

    tcp_c.py 客户端代码

IO.py 代码:


from select import * #引入 select 模块

from socket import * #引入 socket 模块


s = socket() #实例化一个socket 对象

s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #设置端口可重用

s.bind(('0.0.0.0',8888)) #绑定端口号 8888

s.listen(5) #设置监听队列


rlist = [s] #设置读列表(被动列表)

wlist = [] #设置写列表(主动列表)

xlist = [] #设置出错列表


while True: #循环等待客户端连接

rs,ws,xs = select(rlist, wlist, xlist) #将三个列表托管给select 对象

for r in rs: #遍历 读列表(收到客户端请求的对象)

if r is s: # 如果是 s 套接字对象接收到请求,则说明是新的用户连接

c,addr = s.accept() #处理客户端请求,将连接套接字赋值给 c 用户地址赋值给 addr

print(addr,'连接至s') #打印连接提示信息

rlist.append(c) #将连接套接字添加进 读列表,以便保持持续的连接

else: #如果不是 s 套接字对象接收的请求,则说明是已有的现成连接

data = r.recv(1024) #接收客户端传过来的数据

if not data:#如果没有发送过来任何数据

r.close() #将当前套接字关闭

rlist.remove(r) #将当前套接字移除出rlist列表,使 select 不再监管此对象

else: #如果有发送过来的数据

print(data.decode()) #打印出客户端发送过来的数据

r.send('已收到你的消息'.encode()) #给客户端回复数据

for w in ws: #遍历 写列表(主动发起的列表)  只要此列表有对象,会马上触发

pass #由于基本上用不到这个列表,所以此处不写任何代码

for x in xs: #遍历 发生错误的套接字列表

pass #由于基本上用不到这个列表,所以此处不写任何代码

IO.py 代码

tcp_c.py代码:

from socket import *

import time


#创建套接字

sockfd = socket(AF_INET,SOCK_STREAM)


#发起连接

server_addr = ('127.0.0.1',8888)

sockfd.connect(server_addr)

i = 0

while True:

data = input('发送>>')

#data = '哈哈'+str(i)

sockfd.send(data.encode())

data = sockfd.recv(1024)

print('接收到:',data.decode(),i)

i += 1


sockfd.close()

tcp_c.py代码

运行结果:



运行结果:

最后编辑于:2021/02/17作者: 牛逼PHP

发表评论