标签:管理 模式 pytho col select add threading block ret
server
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",9000))
sk.setblocking(False)# 设置socket为非阻塞模式
sk.listen()
conn_l = []# 用于存储conn
del_l = []# 用于存储已经断开连接需要删除的连接
while True:
try:
conn,addr = sk.accept()# 不阻塞,但是没有连接会报错
conn_l.append(conn)# 将连接添加到用于统一管理的conn_l中
except BlockingIOError:
try:
for conn in conn_l:# 利用了列表为空是for不执行的原理
msg = conn.recv(1024)# 不阻塞,但是没有数据会报错
if msg == b"":# 返回的内容为空则说明连接已经断开
del_l.append(conn)# 添加到待删除的列表中
continue
print(msg)
conn.send(b"bye")
except BlockingIOError:pass
for i in del_l:
conn_l.remove(i)# 删除已经断开的连接
del_l.clear()# 清空存储已经断开的连接的列表
client
import socket
import threading
def func():
sk = socket.socket()
sk.connect(("127.0.0.1",9000))
sk.send(b"hello")
print(sk.recv(1024))
sk.close()
for i in range(20):
# 使用多线程来模拟多个客户端连接服务器
t = threading.Thread(target=func)
t.start()
server
import select
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",8080))
sk.setblocking(False)
sk.listen()
read_list = [sk]
while True:
r_list,w_list,x_list = select.select(read_list,[],[])
for i in r_list:
if i is sk:
conn,addr = i.accept()
read_list.append(conn)
else:
ret = i.recv(1024)
if ret == b"":
i.close()
read_list.remove(i)
continue
print(ret)
i.send(b"bye")
client
import socket
import threading
def func():
sk = socket.socket()
sk.connect(("127.0.0.1",8080))
sk.send(b"hello")
print(sk.recv(1024))
sk.close()
for i in range(20):
# 使用多线程来模拟多个客户端连接服务器
t = threading.Thread(target=func)
t.start()
标签:管理 模式 pytho col select add threading block ret
原文地址:https://www.cnblogs.com/changjiangwei/p/11879204.html