非ブロックsocketとio多重化(整理されていない)
3794 ワード
同期ブロックio
同期非ブロックio
非ブロックsocket同時実行
io多重化
マルチチャットクライアントimport socket server=socket.socket() server.setblocking(False)#非ブロックserverを設定.bind("",6969) server.Listen(5)clients=[]接続されたクライアントwhile True:#ループ受信クライアントtry:conn,addr=serverを格納.accept()conn.setblocking(False)#このピア接続を非ブロックclientsに設定.append((conn,addr))except Exception:pass#ループ処理ピア接続for client,addr in clients:#受信データtry:recv_data = client.recv(1024) if recv_data:#すべての人にdata="receive{}from{}"を送る.format( recv_data.decode(“utf-8”), addr ) for c,a in clients: c.send(recv_data) else: clients.remove((client,addr)) client.close() except Exception: pass
#送信側import socket client=socket.socket() client.connect((“127.0.0.1”,6969)) while True: data = input(">>>") if data = “q”: break client.send(dta.encode) client.close()
#受信側import socket client=socket.socket() client.connect((“127.0.0.1”,6969)) while True: res = client.recv(1024) print(res.decode(“utf-8”))
- io input,output, ,
input, output
input, output
- : read , , , read , , , ,read ,
-
同期非ブロックio
1. read , , , read ,
io , , , CPU
, io io
2.
1.
setblocking(False)
2. accept,recv
, , blockingioerror,
3. socket
4. io
非ブロックsocket同時実行
1. :
accept, , socket,
socket
#
import socket
server = socket.socket()
server.setblocking(False) #
server.bind(("",6969))
server.listen(10)
client_list = [] #
# ,
while True:
#
try:
conn,addr = server.accept() # blockingioerror
conn.setblocking(False) #
client_list.append((conn,addr))
print(" :{}".format(addr))
except BlockingIOError:
pass
#
for client,addr in client_list:
try:
recv_data = client.recv(1024) #
if recv_data:
print(" :{}>>>{}".format(
addr,recv_data.decode("utf-8")
))
client.send(recv_data) #
else:
client_list.remove((client,addr)) #
client.close()
print(" :{}".format(addr))
except BlockingIOError:
pass
io多重化
- epoll inux , epoll
- windows epoll,Windows select
- io
:
1. epoll
2.
3. socket
4.
# epoll io
import socket
import selectors
server = socket.socket()
#
server.bind(("",6969))
server.listen(1000)
def recv(soc):
data = soc.recv(1024)
if data:
soc.send(data)
else:
#
epoll_selector.unregister(soc)
soc.close()
def accept(soc):
#
conn,addr = soc.accept()
# epoll
epoll_selector.register(
conn,
selectors.EVENT_READ,
recv
)
# epoll
epoll_selector = selectors.DefaultSelector() #
# server
epoll_selector.register(
server, # socket
selectors.EVENT_READ, #
accept #
)
#
while True:
events = epoll_selector.select() #epoll_select
# events
for key,mark in events:
sock = key.fileobj #socket
callback = key.data
#
callback(sock)
マルチチャットクライアントimport socket server=socket.socket() server.setblocking(False)#非ブロックserverを設定.bind("",6969) server.Listen(5)clients=[]接続されたクライアントwhile True:#ループ受信クライアントtry:conn,addr=serverを格納.accept()conn.setblocking(False)#このピア接続を非ブロックclientsに設定.append((conn,addr))except Exception:pass#ループ処理ピア接続for client,addr in clients:#受信データtry:recv_data = client.recv(1024) if recv_data:#すべての人にdata="receive{}from{}"を送る.format( recv_data.decode(“utf-8”), addr ) for c,a in clients: c.send(recv_data) else: clients.remove((client,addr)) client.close() except Exception: pass
#送信側import socket client=socket.socket() client.connect((“127.0.0.1”,6969)) while True: data = input(">>>") if data = “q”: break client.send(dta.encode) client.close()
#受信側import socket client=socket.socket() client.connect((“127.0.0.1”,6969)) while True: res = client.recv(1024) print(res.decode(“utf-8”))