select_socket_server簡單實例
importselect,socket,queue
server=socket.socket()
server.bind(('localhost',9000))
server.listen(1000)
server.setblocking(False)#設(shè)置非阻塞模式
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連接 返回三個數(shù)據(jù)
print(readable,writeable,exceptional)
forrinreadable:
ifrisserver:#代表來了一個新連接 下一次select
conn,addr=server.accept()
print("來了一個新連接:",addr)
inputs.append(conn)#是因為這個新建立的連接還沒發(fā)數(shù)據(jù)過來,現(xiàn)在就接收的話程序就報錯了,
#所以要想實現(xiàn)這個客戶端發(fā)數(shù)據(jù)來時server端能知道,就需要讓select在監(jiān)測這個conn
else:#如果不是新連接,是之前那個conn 就接收數(shù)據(jù) 下一次select
data=r.recv(1024)
print("收到數(shù)據(jù):",data)
data1=(str(data.decode("utf-8")).upper()).encode()
r.send(data1)
print("send done...")
創(chuàng)新互聯(lián)是專業(yè)的青羊網(wǎng)站建設(shè)公司,青羊接單;提供成都網(wǎng)站設(shè)計、成都網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行青羊網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
10年積累的成都做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有朝陽縣免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
有隊列的select_socket_server實例
importselect,socket,queue
server=socket.socket()
server.bind(('localhost',9000))
server.listen(1000)
server.setblocking(False)#設(shè)置非阻塞模式
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連接 返回三個數(shù)據(jù)
print(readable,writeable,exceptional)#outputs 放啥下一次就出啥 下一次循環(huán)的時候就返回了
forrinreadable:
ifrisserver:#代表來了一個新連接 下一次select
conn,addr=server.accept()
print("來了一個新連接:",addr)
inputs.append(conn)#是因為這個新建立的連接還沒發(fā)數(shù)據(jù)過來,現(xiàn)在就接收的話程序就報錯了,
#所以要想實現(xiàn)這個客戶端發(fā)數(shù)據(jù)來時server端能知道,就需要讓select在監(jiān)測這個conn
msg_dic[conn]=queue.Queue()#初始化一個隊列,后面存要返回給這個客戶端的數(shù)據(jù)
else:#如果不是新連接,是之前那個conn 就接收數(shù)據(jù) 下一次select
data=r.recv(1024)
print("收到數(shù)據(jù):",data)
msg_dic[r].put(data)#往隊列里面扔數(shù)據(jù) 等于字典里添加values
outputs.append(r)#放入返回的連接隊列里
#r.send(data)
#print("send done...")
forwinwriteable:#要返回給客戶端的連接列表
data_to_client=msg_dic[w].get()#返回給這個客戶端的數(shù)據(jù) 取隊列里面的數(shù)據(jù) 相當(dāng)于取字典里面的values
w.send(data_to_client)#返回給客戶端的源數(shù)據(jù)
outputs.remove(w)#確保下次循環(huán)的時候writeable,不返回已經(jīng)處理完的連接
foreinexceptional:#連接已經(jīng)斷開,異常處理
ifeinoutputs:
outputs.remove(e)#清理已經(jīng)斷開的連接
inputs.remove(e)#清理已經(jīng)斷開的連接
delmsg_dic[e]#清理已經(jīng)斷開的連接
支持大并發(fā)的selectors模塊
importselectors
importsocket
sel = selectors.DefaultSelector()
defaccept(sock,mask):#相當(dāng)于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回調(diào)函數(shù)
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 默認(rèn)阻塞 有活動連接就返回活動的連接列表
forkey, maskinevents:
callback = key.data#accept
callback(key.fileobj, mask)#key.fileobj=文件句柄
多路連接socket_client
#_*_coding:utf-8_*_
__author__ ='Alex Li'
importsocket
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() )
網(wǎng)頁名稱:IO_多路復(fù)用_select_epool模式
標(biāo)題來源:http://aaarwkj.com/article30/phdepo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、關(guān)鍵詞優(yōu)化、網(wǎng)站設(shè)計公司、App開發(fā)、建站公司、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)