當乙個伺服器需要與多個客戶端進行通訊時,可以使用多程序或者多執行緒的伺服器,也可以使用select模組,它可以實現非同步通訊。python中的select模組包含了poll()和select(),select的原型為(rlist,wlist,xlist[,timeout]),其中rlist是等待讀取的物件,wlist是等待寫入的物件,xlist是等待異常的物件,最後乙個是可選物件,指定等待的時間,單位是s. select()方法的返回值是準備好的物件的三元組,若在timeout的時間內,沒有物件準備好,那麼返回值將是空的列表。
下面是使用select的伺服器:
#!/usr/bin/env python
import socket,select
server=socket.socket(socket.af_inet,socket.sock_stream)
server.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)
server.bind(('',10000))
server.listen(5)
inputs=[server]
while 1:
rs,ws,es=select.select(inputs,,,1)
for r in rs:
if r is server:
clientsock,clientaddr=r.accept();
else:
data=r.recv(1024);
if not data:
inputs.remove(r);
else:
print data
再編寫客戶端程式,就可以測試select伺服器了,客戶端**為:
#!/usr/bin/env python
import socket
host='127.0.0.1';
port=10000;
s=socket.socket(socket.af_inet,socket.sock_stream)
s.connect((host,port))
s.send('hello from client')
s.close();
poll實現伺服器時,需要用到register()和unregister()方法,作用是加入和移除物件,poll()的返回值包括了檔案描述符和事件,polling的事件常量有pollin,pollpri,pollpout,pollerr,pollhup,pollval,分別表示讀取資料,讀取緊急資料,檔案描述符已經準備好,檔案描述符出錯,連線丟失,無效請求。
下面是使用poll的伺服器程式:
#!/usr/bin/env python
import socket,select
s=socket.socket()
host=""
port=10000
s.bind((host,port))
fdmap=
s.listen(5)
p=select.poll()
p.register(s.fileno(),select.pollin|select.pollerr|select.pollhup)
while 1:
events=p.poll(5000)
if len(events)!=0:
if events[0][1]==select.pollin:
sock,addr=s.accept()
buf=sock.recv(8196)
if len(buf)!=0:
print buf
sock.close()
print "no data"
再編寫客戶端程式,即可以測試伺服器程式,客戶端為:
#!/usr/bin/env python
import socket
port=10000
s=socket.socket()
host=socket.gethostname()
s.connect((host,port))
s.send("hello from the client")
s.close()
socket 使用select 非阻塞方式實現
select函式原型如下 int select int maxfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout select系統呼叫是用來讓我們的程式監視多個檔案控制代碼 socket 控制代碼 的狀...
select的列子說明select內部實現原理
1 select內部是個陣列,而epoll內部結構是紅黑二叉樹 2 select查詢起來慢,而epoll查詢起來快 3 每次迴圈,內部都要發生拷貝 檢視相關 而epoll不需要這樣的操作,也就是初始化一次拷貝 include include include include include int m...
select 函式 使用
告知核心等待某一或某些事件發生 而後喚醒程序 或超時返回 int select int maxfdp1,fd set readset,fd set writeset,fd set excepset,const struct timeval timeout 返回準備好的描述符數量 超時返0錯誤 1 主...