# 這里異步服務器的實作是借助于select,有關select模塊在我上邊的博客中有體現,
# zen_utils也是我們自己寫的一個腳本,也在上邊的磨課中
import select, zen_utils,queue,time
def serve(listener,inpouts,outputs,message_queues):
while inputs:
print('等待開始第一個執行緒連接1111')
# 開始select監聽,對input_list中的服務器端的server開始進行監聽
# 一旦呼叫socket的send,recv函式,將會再次呼叫此模塊
# 這里監控三個引數,第一個回傳的是可讀的list, 第二個存盤的是可寫的list, 第三個存盤的是錯誤資訊的
readable, writeable, errorinfo = select.select(inputs, outputs, inputs)
# 這里判斷的是有沒有客戶端進行連接,
for s in readable:
# 然后在進行判斷是服務端觸發的連接還是客戶端觸發的鏈接,
if s is listener:
# 接收的訊息和客戶端的IP埠
print(s)
connection, client_address = s.accept()
print('client:', connection, client_address)
# 設定為非阻塞模式,
connection.setblocking(0)
# 將客戶端連接也加入到inputs監聽串列中,
inputs.append(connection)
# 加入到要發送的訊息佇列中,
message_queues[connection] = queue.Queue()
else:
# 這是客戶端發送訊息觸發的請求,
data = https://www.cnblogs.com/cong12586/p/s.recv(1024)
if data != b'?' and data != b'':
print('客戶端{}發送了{}訊息', s.getpeername(), data.decode('utf-8'))
# 將接收到的訊息需要進行回復的答案,放到對應的訊息佇列中,
print(zen_utils.aphorisms.get(data,b''))
message_queues[s].put(zen_utils.aphorisms.get(data,b''))
if s not in outputs:
outputs.append(s)
else:
print("一個客戶端斷開了連接", client_address)
# 輸出端不在監聽,
if s in outputs:
outputs.remove(s)
# 輸入端不再監聽
inputs.remove(s)
# 關閉這個套接字,
s.close()
# 洗掉訊息佇列中的訊息
del message_queues[s]
# 下邊是處理輸出,
for s in writeable:
try:
message_queue = message_queues.get(s)
sent_datahttps://www.cnblogs.com/cong12586/p/= ''
if message_queue is not None:
# 如果訊息佇列為空,不阻塞
sent_data = https://www.cnblogs.com/cong12586/p/message_queue.get_nowait()
else:
# 這里觸發的客戶端關閉連接,
print('客戶端關閉連接')
except queue.Empty:
# 客戶端發送完了訊息,
print('%s' % s.getpeername())
outputs.remove(s)
else:
if sent_data != '':
s.sendall(sent_data)
else:
print('客戶端關閉連接')
# 處理例外情況,
for s in errorinfo:
print('有一個例外客戶端的連接', s.getpeername())
inputs.remove(s)
if s in outputs:
outputs.remove(s)
s.close()
del message_queues[s]
time.sleep(1)
if __name__ == '__main__':
address = zen_utils.parse_command_line('獲取IP埠')
listener = zen_utils.create_srv_socket(address)
# 將定義好的一個套接字傳入到串列中,
inputs = [listener]
# 處理要發送的資料,
outputs = []
# 要發送的資料
message_queues = {}
serve(listener,inputs,outputs,message_queues)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/230884.html
標籤:Python
