服務端
importsocket
import
time
import
select
server =socket.socket()
server.bind((
"127.0.0.1
",1688))
server.listen(5)
#server.setblocking(false) # 預設為阻塞 設定為false 表示非阻塞
"""引數1 rlist 裡面儲存需要被檢測是否可讀(是否可以執行recv)的socket物件
引數2 wlist 裡面儲存需要被檢測是否可寫(是否可以執行send)的socket物件
引數3 xlist 儲存你需要關注異常條件 忽略即可
引數4 timeout 檢測超時時間 一段時間後還是沒有可以被處理的socket 那就返回空列表
返回值: 三個列表
1 已經有資料到達的socket物件
2 可以傳送資料的socket物件 怎麼可以發 緩衝區沒有滿
3 忽略....
"""rlist =[server,]
wlist =
#要傳送的資料和socket
msgs =
while
true:
ras,was,_ = select.select(rlist,wlist,) #
阻塞直到socket可讀或是可寫
#處理可讀的socket
for s in
ras:
if s ==server:
client,addr =server.accept()
else
:
try:
#收資料
data = s.recv(2048)
ifnot
data:
raise
connectionreseterror()
#s.send(data.upper())
#將要傳送的資料和socket 儲存起來
except
connectionreseterror:
s.close()
rlist.remove(s)
if s in
wlist:wlist.remove(s)
#處理可寫的socket
for s in
was:
for msg in
msgs[:]:
if msg[0] ==s:
s.send(msg[1].upper())
#傳送成功之後 刪除已經無用的資料 並且需要將socket從wlist列表中刪除
#不刪除會造成死迴圈 因為socket 一直處於可寫狀態
msgs.remove(msg)
wlist.remove(s)
客戶端
importosimport
socket
client =socket.socket()
client.connect((
"127.0.0.1
",1688))
while
true:
msg = input("
msg:")
ifnot msg:continue
client.send(msg.encode(
"utf-8"))
print(client.recv(2048).decode("
utf-8
"))
python socket併發模型 非阻塞IO
設定將原本阻塞io變為非阻塞io 方法1 sockfd.setblocking bool 方法2 sockfd.settimeout sec from socket import from time import ctime,sleep f open log.txt a 日誌檔案 s socket ...
阻塞 非阻塞
阻塞和非阻塞指 的是在接收和傳送時是否等待動作完成才返回 舉例 阻塞 block 是指,你撥通某人 的 但是此人不在,於是你拿著 等他回來,其間不能再用 非阻塞 nonblock 是指,你撥通某人 的 但是此人不在,於是你結束通話 待會兒再打。至於到時候他回來沒有,只有打了 才知道。即所謂的 輪詢 ...
阻塞非阻塞
阻塞和非阻塞 阻塞 可用在assign語句和always語句中,表示只要源訊號發生變化,目標訊號就立刻完成賦值操作,在always塊中,結果與語句順序有關,在always塊中是順序關係 非阻塞 只能用在always語句中,表示該語句結束時完成賦值操作,結果與語句順序無關,並行關係 可以這樣理解 阻塞...