IO_多路復用_select_epool模式

select_socket_server簡單實例
importselect,socket,queue

server=socket.socket()

server.bind(('localhost',9000))
server.listen(1000)

server.setblocking(False)#設置非阻塞模式

inputs=[server,]
#inputs=[server,conn] #[conn,]
#inputs=[server,conn,conn2] #[conn2,]
outputs=[]
while True:
    readable,writeable,exceptional=select.select(inputs,outputs,inputs)#select監(jiān)測server連接  返回三個數據
    print(readable,writeable,exceptional)
    forrinreadable:
        ifrisserver:#代表來了一個新連接 下一次select
            conn,addr=server.accept()
            print("來了一個新連接:",addr)
            inputs.append(conn)#是因為這個新建立的連接還沒發(fā)數據過來,現在就接收的話程序就報錯了,
            #所以要想實現這個客戶端發(fā)數據來時server端能知道,就需要讓select在監(jiān)測這個conn
        else:#如果不是新連接,是之前那個conn 就接收數據 下一次select
            data=r.recv(1024)
            print("收到數據:",data)
            data1=(str(data.decode("utf-8")).upper()).encode()
            r.send(data1)
            print("send done...")

創(chuàng)新互聯是專業(yè)的青羊網站建設公司,青羊接單;提供成都網站設計、成都網站制作,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行青羊網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!

10年積累的成都做網站、成都網站制作經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站設計后付款的網站建設流程,更有朝陽縣免費網站建設讓你可以放心的選擇與我們合作。

 

 

有隊列的select_socket_server實例
importselect,socket,queue

server=socket.socket()

server.bind(('localhost',9000))
server.listen(1000)

server.setblocking(False)#設置非阻塞模式

msg_dic={}

inputs=[server,]
#inputs=[server,conn] #[conn,]
#inputs=[server,conn,conn2] #[conn2,]
outputs=[]#r
#outputs=[r1,]
while True:
    readable,writeable,exceptional=select.select(inputs,outputs,inputs)#select監(jiān)測server連接  返回三個數據
    print(readable,writeable,exceptional)#outputs 放啥下一次就出啥 下一次循環(huán)的時候就返回了
    forrinreadable:
        ifrisserver:#代表來了一個新連接 下一次select
            conn,addr=server.accept()
            print("來了一個新連接:",addr)
            inputs.append(conn)#是因為這個新建立的連接還沒發(fā)數據過來,現在就接收的話程序就報錯了,
            #所以要想實現這個客戶端發(fā)數據來時server端能知道,就需要讓select在監(jiān)測這個conn
            msg_dic[conn]=queue.Queue()#初始化一個隊列,后面存要返回給這個客戶端的數據

        else:#如果不是新連接,是之前那個conn 就接收數據 下一次select
            data=r.recv(1024)
            print("收到數據:",data)
            msg_dic[r].put(data)#往隊列里面扔數據 等于字典里添加values

            outputs.append(r)#放入返回的連接隊列里
            #r.send(data)
            #print("send done...")

    forwinwriteable:#要返回給客戶端的連接列表
        data_to_client=msg_dic[w].get()#返回給這個客戶端的數據 取隊列里面的數據 相當于取字典里面的values
        w.send(data_to_client)#返回給客戶端的源數據

        outputs.remove(w)#確保下次循環(huán)的時候writeable,不返回已經處理完的連接

    foreinexceptional:#連接已經斷開,異常處理
        ifeinoutputs:
            outputs.remove(e)#清理已經斷開的連接

        inputs.remove(e)#清理已經斷開的連接

        delmsg_dic[e]#清理已經斷開的連接

 

 

支持大并發(fā)的selectors模塊
importselectors
importsocket

sel = selectors.DefaultSelector()


defaccept(sock,mask):#相當于server.accept()
    conn, addr = sock.accept()  # Should be ready
    print('accepted', conn,'from', addr)
    conn.setblocking(False)
    sel.register(conn, selectors.EVENT_READ, read)#新連接注冊read回調函數


defread(conn, mask):#操作
    data = conn.recv(1024)  # Should be ready
    ifdata:
        print('echoing',repr(data),'to', conn,mask)
        conn.send(data)  # Hope it won't block
    else:
        print('closing', conn)
        sel.unregister(conn)
        conn.close()


sock = socket.socket()
sock.bind(('localhost',10000))
sock.listen(1000)
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept)

while True:
    events = sel.select()#看系統(tǒng)支持 select或 epool 默認阻塞 有活動連接就返回活動的連接列表
    forkey, maskinevents:
        callback = key.data#accept
        callback(key.fileobj, mask)#key.fileobj=文件句柄

 


多路連接socket_client
#_*_coding:utf-8_*_
__author__ ='Alex Li'


import
socket
importsys

messages = [b'This is the message. ',
             b'It will be sent ',
             b'in parts.',
             ]
server_address = ('localhost',10000)

# Create a TCP/IP socket
socks = [ socket.socket(socket.AF_INET, socket.SOCK_STREAM)foriinrange(100)
          ]

# Connect the socket to the port where the server is listening
print('connecting to %s port %s'% server_address)
forsinsocks:
    s.connect(server_address)

formessageinmessages:

    # Send messages on both sockets
    forsinsocks:
        print('%s: sending "%s"'% (s.getsockname(), message) )
        s.send(message)

    # Read responses on both sockets
    forsinsocks:
        data = s.recv(1024)
        print('%s: received "%s"'% (s.getsockname(), data) )
        if notdata:
            print('closing socket', s.getsockname() )

網頁名稱:IO_多路復用_select_epool模式
標題來源:http://muchs.cn/article30/phdepo.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站策劃、關鍵詞優(yōu)化、網站設計公司、App開發(fā)、建站公司網站導航

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都網站建設公司