非ブロックsocketとio多重化(整理されていない)

3794 ワード

同期ブロックio
- 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”))